思路:简单的并查集
分析:输入的时候把相同集合的元素合并在一起,那么我们用一个vis数组来标记集合根节点是否出现过。比如某个几个的根节点为5,那么就把vis[5] = 1。这样最后我们只需要
枚举一变所有的点,把最后有个根节点求出来就是最大的集合数量
代码:
#include<set> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int MAXN = 50010; int father[MAXN]; void init(int n){ for(int i = 0 ; i <= n ; i++) father[i] = i; } int find(int x){ if(father[x] != x) father[x] = find(father[x]); return father[x]; } void solve(int x , int y){ int fx = find(x); int fy = find(y); if(fx != fy) father[fx] = fy; } int main(){ int cas = 1; int n , m; int x , y; while(scanf("%d%d" , &n , &m) && n+m){ init(n); while(m--){ scanf("%d%d" , &x , &y); solve(x , y); } set<int>s; for(int i = 1 ; i <= n ; i++) s.insert(find(i)); printf("Case %d: %d\n" , cas++ , s.size()); } return 0; }