题意:调查学校的学生宗教信仰情况,第一行输入 n(总人数)和 m,接下来 m 行,每行两个数代表这两个人信仰共同的宗教,没人最多信仰一个宗教。问所有人最多信仰多少个宗教。
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> using namespace std; int fa[50005]; int n; int findfa(int x){ if(fa[x] != x){ fa[x] = findfa(fa[x]); } return fa[x]; } void add(int x, int y){ if(x > y) swap(x, y); x = findfa(x); y = findfa(y); if(x != y){ fa[y] = x; n--; } } int main() { int m; int cas = 1; while(scanf("%d %d", &n, &m) != EOF){ if(n == 0 && m == 0) break; for(int i = 1; i <= n; i++) fa[i] = i; while(m--){ int a, b; scanf("%d %d", &a, &b); add(a, b); } printf("Case %d: %dn", cas++, n); } return 0; }