畅通工程(HDU1232)

并查集

 1 #include<iostream>
 2 using namespace std;
 3 
 4 const int MAX=1000;
 5 int father[MAX];
 6 
 7 void initial(int n)    //初始化
 8 {
 9     for(int i=1;i<=n;i++)
10         father[i]=i;
11 }
12 
13 int find(int x)    //查找
14 {
15     while(father[x]!=x)
16         x=father[x];
17 
18     return x;
19 }
20 
21 void combine(int a,int b)   //合并
22 {
23     int tmpa=find(a);
24     int tmpb=find(b);
25 
26     if(tmpa!=tmpb)
27         father[tmpa]=tmpb;
28 }
29 
30 int main()
31 {
32     int i,n,m,a,b,tmp;
33 
34     while(cin>>n,n)
35     {
36         initial(n);
37 
38         cin>>m;
39 
40         for(i=1;i<=m;i++)
41         {
42             cin>>a>>b;
43             combine(a,b);
44         }
45 
46         tmp=0;
47         for(i=1;i<=n;i++)   //确定连通分量个数
48         {
49             if(father[i]==i)
50                 tmp++;
51         }
52 
53         cout<<tmp-1<<endl;
54     }
55 
56     return 0;
57 }

 

posted @ 2013-03-02 16:00  再见~雨泉  阅读(168)  评论(0)    收藏  举报