Hdu 2473(并查集删除操作) Junk-Mail Filter
2014-08-13 19:19
295 查看
有木有很吊
加强
加强版 啊 ,看了都不敢做了 ,后来先做了食物链这个我还是看过的,但还是A不掉,没明白神魔意思 ,总而言之,大牛的博客是个好东西,我就那么看了一下,还是不懂怎莫办啊,哎,就那样就A掉了。。。。。。。今天我们来谈一下这个并查集的删除操作,根据我对大牛的理解啊,这个并查集的删除操作并不是把原来的节点删除掉,而是用一个替身替掉,现在的这个点只是用作桥梁的作用,即是无用的,del ,,,del ,,,,删除,那些被删掉的就从n开始给他们一个地址,然后即如下代码所示
比如说如上图,还没有并到5之前,要删除节点4,如果直接把4直接删除掉的话,那么4上的关系全部删除了,1,3就不在一个集合,但是还要他们在一个集合,那么就给4一个虚拟的节点,在接下来把虚拟节点就是1,3的父节点了,但是这样并不是正确的,那么就在和5并起来的时候,把它们各自的虚拟节点并上去 ,因为初始化的时候他们的虚拟节点也是他们本身,所以它们最后还是并到了一个集合,根节点还是5.有可能也是虚拟的节点,这都不重要,但是1,3的关系没有变。
假如已经变为上面的那个图了,把4删除掉之后,给他一个新的虚拟节点之后,但是他本身还在这边,相当于一个一个桥连接着,只是他的父节点已经变了,但是其他的还在这里面。也就是说已经成功的把它删除了,他已经属于另一个集合了
以下是测试数据
5 6
M 0 1
M 1 2
M 1 3
S 1
M 1 2
S 3
#include <stdio.h> #include <string.h> #define N 100001 #define M 1000001 int par[N+M+50]; int repplace[N+50]; int flag[N+M]; int ind; void init(int n ) { for(int i=0;i<n;i++) { par[i]=i; repplace[i]=i; } ind =n; } int findset(int n) { if(n==par ) return n; else return par =findset(par ); } void unite(int n,int m) { int pn=findset(n); int pm=findset(m); if(pn!=pm) par[pn]=pm; } void Delete(int n)//删除操作, { repplace =ind; par[ind]=ind; ind++; } int main() { int a,b; char s[3]; int x,y; int cas=0; while(scanf("%d%d",&a,&b)==2)//我一直纠结为什莫会WA,判断输入的控制条件错了 { if(a==0&&b==0) break; init(a); for(int i=0;i<b;i++) { scanf("%s",s); if(s[0]=='M') { scanf("%d%d",&x,&y); unite(repplace[x],repplace[y]); } else { scanf("%d",&x); Delete(x); } } memset(flag,0,sizeof(flag)); int ans=0; for(int i=0;i<a;i++)//判断他们有几个集合 { int hh=findset(repplace[i]); if(!flag[hh]) { flag[hh]=1; ans++; } } printf("Case #%d: %d\n",++cas,ans); } }其它就不做介绍了,只要会并查集的一般能看懂看懂,看不懂可评论,或发私信。。。。。。
相关文章推荐
- Hdu 2473(并查集删除操作) Junk-Mail Filter
- HDU-2473-Junk-Mail Filter-并查集的删除操作
- [HDOJ2473]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
- hdu2473 Junk-Mail Filter 并查集的删除
- HDU 2473-Junk-Mail Filter-并查集删除
- HDU-2473 Junk-Mail Filter 并查集的删除
- HDU 2473 Junk-Mail Filter 并查集删除(FZU 2155盟国)
- hdoj 2473 Junk-Mail Filter【并查集节点的删除】
- HDU 2473 Junk-Mail Filter (并查集节点删除)
- hdoj 2473 Junk-Mail Filter 【并查集的删除 】