Problem E: 变形金刚(并查集)

#include <iostream>#include <cstdio>using namespace std;#define maxn 100005struct node{int parent;int rank;}elem[maxn];int n,m,t;void Init()//初始化{for(int i=1;i<=n;i++)//注意下标{elem[i].parent=i;elem[i].rank=1;}}int Find(int x)//寻找根节点{ int root,tmp; tmp=x; while(x!=elem[x].parent) {x=elem[x].parent; } root=x; x=tmp; while(x!=elem[x].parent) {tmp=elem[x].parent;elem[x].parent=root;x=tmp; } return root;}void Union(int a,int b)//合并{int x,y;x=Find(a);y=Find(b);if(elem[x].rank>=elem[y].rank){elem[y].parent=elem[x].parent;elem[x].rank+=elem[y].rank;}else{elem[x].parent=elem[y].parent;elem[y].rank+=elem[x].rank;}}int main(){int x,y,a,b,cnt;scanf("%d",&t);while(t–){scanf("%d%d",&n,&m);Init();for(int i=0;i<m;i++){scanf("%d%d",&x,&y);a=Find(x);b=Find(y);if(a!=b)Union(x,y);}cnt=0;for(int i=1;i<=n;i++){if(elem[i].parent==i)//判断几个集合cnt++;}printf("%d\n",cnt-1); } return 0;}

,你要以乐观的态度看待这个世界,你会发现世界是如此得美好

Problem E: 变形金刚(并查集)

相关文章:

你感兴趣的文章:

标签云: