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; }
相关文章推荐
- HDU 2473 Junk-Mail Filter 并查集删除(FZU 2155盟国)
- HDU 2473 - Junk-Mail Filter ,并查集的删点
- HDU 2473 Junk-Mail Filter 【并查集+设立虚父节点(马甲)】
- hdu 2473 Junk-Mail Filter(删除节点操作的并查集)
- hdu 2473 Junk-Mail Filter(并查集_虚节点)2008 Asia Regional Hangzhou
- HDU 2473 Junk-Mail Filter(并查集的删除操作)
- 来个杭电的题 ---并查集 HDU 2473 Junk-Mail Filter
- HDU 2473 Junk-Mail Filter 并查集,虚拟删除操作
- HDU 2473 Junk-Mail Filter(带分离操作的并查集)
- HDU 2473 Junk-Mail Filter(并查集)
- hdu 2473 Junk-Mail Filter(并查集)
- HDU 2473 Junk-Mail Filter 删点并查集
- HDU 2473 Junk-Mail Filter (删点并查集)
- HDU 2473 Junk-Mail Filter 并查集
- hdu 2473 Junk-Mail Filter 并查集
- hdu 2473 Junk-Mail Filter(并查集的删除操作)
- 并查集的删除—hdu 2473 Junk-Mail Filter
- HDU 2473 Junk-Mail Filter (并查集节点删除)
- HDU 2473 ( Junk-Mail Filter ) (并查集删除操作)
- hdu 2473 Junk-Mail Filter 并查集 虚父节点