该题为简单的并查集应用,只要按要求把给定的关系合并起来,并在合并时遴选出最佳个数即可。
代码如下:
#include#include #include #include using namespace std; int set[100005]; int cnt[100005]; int max; inline int find( int x ) { return set[x]= x == set[x]? x: find( set[x] ); } inline void merge( int x, int y ) { int a= find( x ), b= find( y ); if( a!= b ) { cnt[b]+= cnt[a]; max = max > cnt[b]? max : cnt[b]; set[a]= b; } } /*inline int read( int &d ){ char ch; int flag= 1; while( ch= getchar(), ch== ' ' || ch== '\n' ); if( ch== '-' ) { flag= -1; d= 0; } else{ d= ch- '0'; } while( ch= getchar(), ch>= '0' && ch<= '9' ) d= d* 10+ ch- '0'; return d *= flag; }*/ inline int read( int &t ) { char c; while( c= getchar(), c< '0'|| c> '9' ) ; t= c- '0'; while( c= getchar(), c>= '0'&& c<= '9' ) { t= t* 10+ c- '0'; } } int main() { int N, Mnum = 100000; // 实际数据不大 while( scanf( "%d", &N )!= EOF ) { max= 1; for( int i= 1; i<= Mnum; ++i ) { set[i]= i; cnt[i]= 1; } for( int i= 1; i<= N; ++i ) { int x, y; read( x ), read( y ); merge( x, y ); Mnum= Mnum> x? Mnum: x; Mnum= Mnum> y? Mnum: y; } printf( "%d\n", max ); } return 0; }