并查集 HDU1232

 1 #include <iostream>
 2 #include <map>
 3 #include <cstring>
 4 #include <cstdio>
 5 
 6 using namespace std;
 7 
 8 int father[1010];
 9 int num[1010];
10 
11 int main()
12 {
13     int n,m;
14     while(cin>>n>>m)
15     {
16         int a,b;
17         for(int i=1;i<=1000;i++)
18             father[i]=i;
19         for(int i=1;i<=1000;i++)
20             num[i]=1;
21         for(int i=0;i<m;i++)
22         {
23             scanf("%d%d",&a,&b);
24             int fa=a;
25             int fb=b;
26             while(fa!=father[fa])
27             {
28                 fa=father[fa];
29             }
30             while(fb!=father[fb])
31             {
32                 fb=father[fb];
33             }
34             int tmp=a;
35             while(tmp!=fa)
36             {
37                 int l=father[tmp];
38                 father[tmp]=fa;
39                 tmp=l;
40             }
41             int tmpb=b;
42             while(tmpb!=fb)
43             {
44                 int l=father[tmpb];
45                 father[tmpb]=fb;
46                 tmpb=l;
47             }
48             if(fa!=fb)
49             {
50                 father[fb]=fa;
51                 num[fa]=num[fa]+num[fb];
52                 num[fb]=0;
53             }
54         }
55         int ans=0;
56         int tmpn=n;
57         for(int i=1;i<=n;i++)
58         {
59             if(num[i])
60             {
61                 ans++;
62                 tmpn-=num[i];
63             }
64         }
65         ans=ans+tmpn-1;
66         cout<<ans<<endl;
67     }
68     return 0;
69 }
View Code

 

posted @ 2015-08-10 16:09  相儒以沫  阅读(112)  评论(0编辑  收藏  举报