并查集求连通分量的个数

来源:互联网 发布:绝代双骄三 知乎 编辑:程序博客网 时间:2024/06/15 17:27

题目连接:http://acm.hdu.edu.cn/diy/contest_showproblem.php?cid=23144&pid=1001

简单的并查集题目,先做一次并查集,然后如果f[x] == x那么联通分量数目加1

代码如下:

#include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#include<time.h>#include<math.h>#define N 1005#define eps 1e-9#define pi acos(-1.0)#define P system("pause")using namespace std;int f[N];int find(int x){    return x == f[x] ? x : f[x] = find(f[x]);    }int main(){//freopen("input.txt","r",stdin);//freopen("output.txt","w",stdout);    int n,m;    while(scanf("%d",&n) && n)    {         scanf("%d",&m);         int i;         int x,y;         for(i = 0; i <= n; i++)               f[i] = i;         for(i = 0; i < m; i++)         {               scanf("%d%d",&x,&y);               x = find(x);               y = find(y);               if(x != y) f[x] = y;               }                                  int ans = 0;         for(i = 1; i <= n; i++)        // {cout<<f[i]<<" ";                 if(f[i] == i)                      ans++;         //}cout<<endl;         printf("%d\n",ans-1);              }                                          //  P;                                   return 0;    }

 

0 0
原创粉丝点击