HDU 1473 并查集 删除结点操作 建立虚拟根结点
2013-04-16 13:50
281 查看
这个题显然是用并查集,主要是涉及到并查集中结点的删除,一般而言构造的并查集要独立出结点,直观的想法是直接修改它的父结点为自己,但这样会出现错误。它原来的子结点也跟着一起独立出来了,这和题目是不符合的(题目只要求独立出要独立的那个,它的孩子结点还是应该在本来的那棵树上),考察合并函数发现,合并时总是把一个集合的根结点作为另一个集合的根结点。之所以不好把某个结点直接独立出来是因为它本身还是别的点的父结点,而这种情况出现的原因就是自己做过根结点。为保证编号为0-n-1的结点永远只做叶子结点,只需要给它们找个虚拟的根结点即可,也就是说,当某个结点只含自己时的初试状态不是p[x] = x,而是p[x] = 虚拟根结点编号。
这样要独立出某个结点时,直接修改某结点的p[x] = 虚拟根结点编号(该虚拟根结点自己也是一个独立的集合)
这里还有的一个技巧是因为getchar()速度快于scanf()函数,因为有大量数据的读入,所以自己用getchar()写一个scan函数用来读入能省不少时间,用scanf跑了1200ms用scan只读了300ms
以上是校队讨论时lwl同学的讲解`````
View Code
贴代码:
这样要独立出某个结点时,直接修改某结点的p[x] = 虚拟根结点编号(该虚拟根结点自己也是一个独立的集合)
这里还有的一个技巧是因为getchar()速度快于scanf()函数,因为有大量数据的读入,所以自己用getchar()写一个scan函数用来读入能省不少时间,用scanf跑了1200ms用scan只读了300ms
以上是校队讨论时lwl同学的讲解`````
View Code
#include <cstdio> #include <cstring> #define MAXN 100005+1000000 int p[MAXN]; int n,m; int find(int x) { return p[x] == x ? x : p[x] = find(p[x]); } void Union(int x,int y) { int r1=find(x); int r2=find(y); p[r1] = r2; } void scan(int &x) { char c; while(c=getchar(),c<'0'||c>'9'); x = c-'0'; while(c=getchar(),(c>='0'&&c<='9')) x = x*10+c-'0'; } int main() { // freopen("out.cpp","r",stdin); int ser = 0; while(1) { scan(n); scan(m); if(n==0 && m==0) break; for(int i=0; i<n; ++i) p[i] = n+i; for(int i=n; i<MAXN; ++i) p[i] = i; int ptr = 2*n; while(m--) { char c; while(c= getchar(),c!='M'&&c!='S'); if(c =='M') { int x,y; scan(x); scan(y); if(find(x) != find(y)) Union(x,y); } else { int h; scan(h); p[h] = ptr++; } } int ans= 0; bool used[MAXN]; memset(used,0,sizeof(used)); for(int i=0; i<n; ++i) { int l = find(i); if(!used[l]) { used[l] =1; ++ans; } } printf("Case #%d: %d\n",++ser,ans); } return 0; }
贴代码:
相关文章推荐
- HDU 2473 Junk-Mail Filter 并查集,虚拟删除操作
- hdu 2473 (并查集 删除操作)
- 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并查集的删除操作
- hdu 2473 Junk-Mail Filter(并查集的删除操作)
- 单链表的建立(头部延长、尾部延长)、插入操作、删除操作(无头结点的删除、有头结点的删除)
- (2)单链表的操作 ① 输入一组整型元素序列,使用尾插法建立一个带有头结点的单链表。 ② 实现该线性表的遍历。 ③ 在该单链表的第i个元素前插入一个整数。 ④ 删除该单链表中的第i个元素,其值通过参数
- HDU 2473 Junk-Mail Filter (并查集的删除操作)
- hdu 2473 Junk-Mail Filter【并查集好题、建立虚拟节点】
- UVA 11987 Almost Union-Find(带有删除操作的并查集)
- 数据结构与算法分析之顺序存储结构的建立,插入和删除操作
- 堆的插入、删除和建立操作,堆排序
- 数据结构与算法分析之单链表的建立,插入和删除操作。