您的位置:首页 > 大数据 > 人工智能

HDU 2473 Junk-Mail Filter 并查集拆分

2011-10-14 16:00 363 查看
这题关键是如何用并查集处理拆除的点,方法就是加虚拟结点,初始时将每个点的father对应指向一个虚拟结点,合并不变,删点的时候直接把该点的father指向一个新的虚拟点就是了。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
#include <cctype>
#include <vector>
#include <queue>
#include <stack>
#include <cassert>
#include <map>
#include <set>
#define Maxn 100100
#define Maxm 1000100
using namespace std;

int n, m, tot, ans;
int fa[Maxm+Maxn*2], id[Maxn];
int find(int x)
{
if (fa[x] == x) return x;
else return fa[x] = find(fa[x]);
}
int main()
{
char op[5];
int a, b, ca=0;
while (scanf("%d%d", &n, &m), n)
{
for (int i=0; i<n; i++) fa[i] = i+n;
for (int i=n; i<=n+m+n; i++) fa[i] = i;
tot = n+n;

for (int i=0; i<m; i++)
{
scanf("%s", op);
if (op[0] == 'M')
{
scanf("%d%d", &a, &b);
int x = find(a);
int y = find(b);
if (x != y) fa[x] = y;
}
else
{
scanf("%d", &a);
fa[a] = tot++;
}
}
for (int i=0; i<n; i++) id[i] = find(i);
sort(id, id+n);
ans = 1;
for (int i=1; i<n; i++)
if (id[i] != id[i-1]) ans++;
printf("Case #%d: %d\n", ++ca, ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: