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;
}

  

你可能感兴趣的:(more)