ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

C. Peaceful Rooks(图论,并查集)

2020-12-26 10:32:23  阅读:312  来源: 互联网

标签:node Rooks ver int 查集 fa Peaceful return find


C. Peaceful Rooks

万万没想到这道题还能用并查集来做,真的是长见识了。

题目的解法是将给的坐标分成两个点,然后将这两个点串起来,当然每次新输入一个点除了要将这两个点串起来,还要看看能不能和上面的点串起来。

如果发现某些点最后串不成一个环,那么称它为一条路径,那么此时答案数就是这条路径上的点数,因为这样所有的点都不用因为其他点而移动到某一个地方从而多走出某一步。而当能够串成一个环时,那么某一个点就要让步给其他点,从而就要多走一步这个环里面的所有点才能到达相应的位置。

当然还有一个注意点就是对于已经在对角线上的点就不要动它了。

连接点使用并查集来维护。

#include <iostream>
#include <algorithm>
using namespace std;

const int N = 200050;
struct Node{
    int x, y;
}node[N];
int fa[N];

int find(int x){
    if(x == fa[x])
        return x;
    else
        return fa[x] = find(fa[x]);
}
void solve(){
    for(int i = 1; i <= 200010; i ++)
        fa[i] = i;
    int n, m, cnt = 0, ver = 1;
    cin >> n >> m;
    for(int i = 1; i <= m; i ++){
        int x, y;
        cin >> x >> y;
        if(x == y)
            continue;
        else
            node[ver].x = x, node[ver].y = y;
        int fx = find(node[ver].x);
        int fy = find(node[ver].y);
        if(fx != fy)
            fa[fx] = fy;
        else
            cnt ++;
        ver ++;
    }
    cout << cnt + ver - 1 << endl;
    return;
}
int main(){
    int t;
    cin >> t;
    while(t --){
        solve();
    }
    return 0;
}

 

标签:node,Rooks,ver,int,查集,fa,Peaceful,return,find
来源: https://www.cnblogs.com/pureayu/p/14191695.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有