HDU-1865 More is better
该题为简单的并查集应用,只要按要求把给定的关系合并起来,并在合并时遴选出最佳个数即可。
代码如下:
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
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;
}