并查集 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 }