您的位置:首页 > 其它

POJ 1611 - The Suspects

2012-10-09 20:45 246 查看
Advanced Data Structures :: Disjoint Set

Description

有n个学生,编号从 0 到 n - 1 。

学生们分成了几个团伙。

而学生0是个“咸鱼饭”,因此和他一个团伙的人都是“咸鱼饭”。

问有几个“咸鱼饭”。

Type

Advanced Data Structures :: Disjoint Set

Analysis

用并查集并一下,然后枚举下每个学生,

查一下有多少人和学生0一个集合,就可以了。

Solution

// POJ 1611
// The Suspect
// by A Code Rabbit

#include <cstdio>

const int MAXN = 30002;

struct DisjointSet {
int p[MAXN];
void Init(int);
void Make(int x) { p[x] = x; }
int Find(int x) { return p[x] == x ? x : p[x] = Find(p[x]); }
int Union(int x, int y) { p[Find(x)] = Find(y); }
};

void DisjointSet::Init(int n) {
for (int i = 0; i < n; i++)
Make(i);
}

int n, m;
DisjointSet set;

int main() {
while (scanf("%d%d", &n, &m) && (n || m)) {
set.Init(n);
for (int i = 0; i < m; i++) {
int k, x, y;
scanf("%d", &k);
scanf("%d", &x);
for (int j = 0; j < k - 1; j++) {
scanf("%d", &y);
set.Union(x, y);
}
}
int ans = 0;
for (int i = 0; i < n; i++)
if (set.Find(i) == set.Find(0))
ans++;
printf("%d\n", ans);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: