畅通工程(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 }

浙公网安备 33010602011771号