hdu 2473 Junk-Mail Filter(并查集)
来源:互联网 发布:成都网络推广收入 编辑:程序博客网 时间:2024/06/05 08:27
题意:给出n个点,有两个操作,一个是把两个点合并,另一个是把某个点移出集合,求所有操作进行后集合的个数。
思路:这题前几天FOJ月赛的时候看到过,原来是08年Regional的题。。。合并好说,把结点移出集合就有些麻烦了,因为这个结点可能是其它点的父节点,为了不出现这种问题,可以设一个虚拟结点,把所有点连到虚拟结点上,这样移除的时候就不用考虑那么多了。需要注意的是本来就是单独的结点不需要移出,一个集合中的点有可能因为其它点都被移出集合从而成为一个单独的点。
代码:
#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<algorithm>#include<map>#include<queue>#include<stack>#include<set>#include<cmath>#include<vector>#define inf 0x3f3f3f3f#define Inf 0x3FFFFFFFFFFFFFFFLL#define eps 1e-9#define pi acos(-1.0)using namespace std;typedef long long ll;const int maxn=2000000+10;int pa[maxn],cnt[maxn];int Find(int x){ return x==pa[x]?x:pa[x]=Find(pa[x]);}int main(){ //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int n,m,tcase=0; char str[5]; while(~scanf("%d%d",&n,&m)) { if(n==0&&m==0) break; tcase++; for(int i=1;i<=n;++i) pa[i]=0; pa[0]=0;cnt[0]=1; int ans=n,x,y,a,b,tot=n; while(m--) { scanf("%s",str); if(str[0]=='M') { scanf("%d%d",&x,&y); x++;y++; a=Find(x); b=Find(y); if(a==0||b==0||a!=b) { ans--;tot++; pa[tot]=tot;cnt[tot]=0; if(a!=0) { pa[a]=tot; cnt[tot]+=cnt[a]; cnt[a]=0; } else { pa[x]=tot; cnt[tot]++; } if(b!=0) { pa[b]=tot; cnt[tot]+=cnt[b]; cnt[b]=0; } else { pa[y]=tot; cnt[tot]++; } } } else { scanf("%d",&x); x++; y=Find(x); if(y==0||cnt[y]==1) continue; pa[x]=0;cnt[y]--; ans++; } } printf("Case #%d: %d\n",tcase,ans); } return 0;}
0 0
- 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 删点并查集
- 并查集 Junk-Mail Filter hdu 2473
- HDU 2473 Junk-Mail Filter 并查集 惰性删除
- hdu 2473 Junk-Mail Filter 并查集 删除点
- hdu 2473 Junk-Mail Filter 并查集删除
- HDU 2473Junk-Mail Filter 【并查集,删点】
- HDU 2473 Junk-Mail Filter 并查集 删点
- HDU 2473-Junk-Mail Filter-并查集删除
- HDU 2473 ( Junk-Mail Filter ) (并查集删除操作)
- HDU 2473 Junk-Mail Filter(并查集删除节点)
- linux 文件(目录)之软链接,硬链接
- hdu3071
- JDK的安装及其运行的环境变量的配置
- 初学者:学习C++primer
- java并发(一)wait,notify的使用
- hdu 2473 Junk-Mail Filter(并查集)
- ios真机运行
- LayoutInflater的作用及使用
- 设计模式——怎么就给分成三类了呢?
- 使用EF6和MVC5实现一个简单的选课系统--EF6的弹性链接和命令拦截(4/12)
- java SE 集合(三)
- KMP中next数组的理解
- 割点、桥、双连通分量
- 国外最猛的开源软件站 源码站