HDU-1856 More is better
1.题面
2.解题思路
就是使用并查集,既然它让我们留下最多的人,我们找出最大的集合就好了,根据我的并查集的特点,直接在每次合并时返回取最大值就好,水水水。
3.解题代码
/*****************************************************************
> File Name: tmp.cpp
> Author: Uncle_Sugar
> Mail: uncle_sugar@qq.com
> Created Time: 2016年02月19日 星期五 12时41分45秒
****************************************************************/
# include <cstdio>
# include <cstring>
# include <cmath>
# include <cstdlib>
# include <iostream>
# include <iomanip>
# include <set>
# include <map>
# include <vector>
# include <stack>
# include <queue>
using namespace std;
const int debug = 1;
const int size = 10000000 + 10;
typedef long long ll;
struct DisjointSet{
int *T,size,sum;
int FindRoot(int i){
return T[i] < 0 ? i : T[i] = FindRoot(T[i]);
}
DisjointSet(){}
DisjointSet(int _size):size(_size){
T = new int[size];
Init();
}
void Init(){sum = size;memset(T,-1,sizeof(int)*size);}
bool Unioned(int i,int j){return FindRoot(i)==FindRoot(j);}
int Union(int i,int j){
if ( (i = FindRoot(i) ) != ( j = FindRoot(j) ) ){
T[i] = T[i] + T[j];
T[j] = i;
sum--;
}
return -T[i];
}
int GetSum(int i){return -T[FindRoot(i)];}
};
DisjointSet dst(size);
int main()
{
std::ios::sync_with_stdio(false);cin.tie(0);
int i,j,k;
int n;
while (cin >> n){
dst.Init();
int ans = 1;
while (n--){
int a,b;
cin >> a >> b;
int k = dst.Union(a,b);
ans = max(ans,k);
}
cout << ans << '\n';
}
return 0;
}