hdu 1232 并查集

来源:互联网 发布:韩春雨 知乎精华 编辑:程序博客网 时间:2024/05/29 18:05

好久没动过并查集,居然错了这么多次

//union_find_set#include<bits/stdc++.h>using namespace std;int n,m;int fa[10002]; void init(){int i;for(i=0;i<=n;i++){fa[i]=i;}return ;}int findd(int x){int s;for(s=x;s!=fa[s];s=fa[s])//一开始写成s!=fa[x],我错了;int tmp;while(s!=x)//这叫什么按秩合并,说是arckerman的反函数,复杂度比log2的速度还要低,不知道是什么玩意{tmp=fa[x];fa[x]=s;x=tmp;}return s;}void Union(int x,int y){int r1=findd(x);int r2=findd(y);if(r1==r2)return ;else{fa[r1]=r2;}return ;}int main(){int i,j,k;int x,y;while(cin>>n>>m){init();int x,y;for(i=0;i<m;i++){cin>>x>>y;Union(x,y);}int cot=0;for(i=1;i<=n;i++){if(fa[i]==i)cot++;}cout<<cot-1<<endl;}}


0 0
原创粉丝点击