Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 327680/102400 K (Java/Others)
Total Submission(s): 8268 Accepted Submission(s): 3088
4 1 2 3 4 5 6 1 6 4 1 2 3 4 5 6 7 8
4 2HintA and B are friends(direct or indirect), B and C are friends(direct or indirect), then A and C are also friends(indirect). In the first sample {1,2,5,6} is the result. In the second sample {1,2},{3,4},{5,6},{7,8} are four kinds of answers.
继续裸并查集,模板搞起~
#include <stdlib.h> #include <iostream> #include <algorithm> using namespace std; const int M = 100005; int fam[M],member[M]; int cas,n,a,b; void ufset( ) { for( int i=0 ; i<M ; i++ ) member[i] = 1 , fam[i] = i; } int find( int x ) { return x == fam[x] ? x : fam[x] = find( fam[x] ); } void merge( int a , int b ) { int x,y; x = find( a ); y = find( b ); if( x!=y ){ fam[x] = y; member[y] += member[x]; } } int main() { while( scanf("%d",&n) == 1 ){ ufset( ); int big = 1; for( int i=0 ; i<n ; i++ ){ scanf("%d%d",&a,&b); if( a > big || b >big ) big = max(a,b); merge( a,b ); } int Max = 0; for( int i=1 ; i<=big ; i++ ) if( member[i] > Max ) Max = member[i]; printf("%d\n",Max); } return 0; }