HDU 4496 D-City
并查集倒过来用就好了,水题。
但是题目貌似有多组数据,可又没有说明,导致我wa了两次。
1 #include<stdio.h> 2 #include<iostream> 3 using namespace std; 4 5 #include<math.h> 6 #include<algorithm> 7 #include<string.h> 8 #include<stdlib.h> 9 #include<vector> 10 #include<set> 11 #include<map> 12 #include<stack> 13 #include<string> 14 #include<queue> 15 16 #define repA(p,q,i) for( int (i)=(p); (i)!=(q); ++(i) ) 17 #define repAE(p,q,i) for( int (i)=(p); (i)<=(q); ++(i) ) 18 #define repD(p,q,i) for( int (i)=(p); (i)!=(q); --(i) ) 19 #define repDE(p,q,i) for( int (i)=(p); (i)>=(q); --(i) ) 20 #define range 100010 21 22 int n,m; 23 int road[range][2]; 24 int f[range]; 25 int condition[range]; 26 27 int find(int s); 28 29 int main() 30 { 31 32 while( scanf("%d%d",&n,&m) != EOF ) 33 { 34 repAE(1,m,i) 35 scanf("%d%d",&road[i][0], &road[i][1]); 36 37 repA(0,n,i) f[i] = i; 38 39 int all=n; 40 condition[m] = n; 41 int p,q; 42 43 repDE(m,1,i) 44 { 45 p = find(road[i][0] ) ; 46 q = find(road[i][1] ) ; 47 48 if(p != q) 49 { 50 f[q] = p; 51 --all; 52 } 53 54 condition[i-1]=all; 55 } 56 57 repAE(1,m,i) 58 printf("%d\n",condition[i]); 59 } 60 //while(1); 61 return 0; 62 } 63 64 int find( int s ) 65 { 66 if( s != f[s] ) 67 f[s] = find( f[s] ); 68 return f[s]; 69 }
To Be The Best Of Yourself