并查集

1. HDU 1232(并查集模板题)

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<string.h>
 4 using namespace std;
 5 #define MAX 1002
 6 int pre[MAX];///用来标记关系
 7 int t[MAX];///用来标记独立的快
 8 int find(int x)///查找根节点                                                                                              //查找根节点
 9 {
10     int r=x;
11     while(pre[r]!=r)                                                                                              //返回根节点 r
12         r=pre[r];
13     int i=x,j;
14     while(i!=r)                                                                                                        //路径压缩
15     {
16         j=pre[i]; // 在改变上级之前用临时变量  j 记录下他的值
17         pre[i]=r ; //把上级改为根节点
18         i=j;
19     }
20     return r;
21 }
22 
23 void join(int x,int y)//判断x y是否连通,
24 //如果已经连通,就不用管了 //如果不连通,就把它们所在的连通分支合并起,
25 {
26     int fx=find(x),fy=find(y);
27     if(fx!=fy)
28         pre[fx]=fy;
29 }
30 int main()
31 {
32     int n,m,from,to,ans,i;
33     while(scanf("%d%d",&n,&m)!=EOF&&n)
34     {
35         for(int i=1; i<=n; i++)//初始化
36             pre[i]=i;
37         for(int i=1; i<=m; i++)
38         {
39             scanf("%d%d",&from,&to);
40             join(from,to);
41         }
42         memset(t,0,sizeof(t));
43         for(int i=1; i<=n; i++)
44             t[find(i)]=1;///标记根节点
45         for(ans=0,i=1; i<=n; i++)
46             if(t[i])
47                 ans++;
48         printf("%d\n",ans-1);
49     }
50     return 0;
51 }
View Code

 

posted @ 2017-04-25 12:01  马丁黄瓜啊  阅读(153)  评论(0编辑  收藏  举报