初学并查集的例题2 UVA 11987 Almost Union-Find
2016-04-27 22:51
393 查看
贴出ac的代码,以及思考中遇到的cuo'wu
//很明显并查集的题目(题目已经说了)需要一点技巧
//采用一个不会是元素的大于maxn整数来当作根节点,这样就不会产生一个节点是跟节点
//其实是可以实现的只要把大于maxn的节点的父亲也设置为自己就好了
//因此不会有一个要移出的节点会是根节点哦,就没问题了
//改代码采用了maxn+i来做根节点。
//要实现三个函数合并,移出和查询,当然还有并查集着根节点
//很明显并查集的题目(题目已经说了)需要一点技巧
//采用一个不会是元素的大于maxn整数来当作根节点,这样就不会产生一个节点是跟节点
//其实是可以实现的只要把大于maxn的节点的父亲也设置为自己就好了
//因此不会有一个要移出的节点会是根节点哦,就没问题了
//改代码采用了maxn+i来做根节点。
//要实现三个函数合并,移出和查询,当然还有并查集着根节点
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=100000+10; int unionset(int p,int q);//把p q所在的集合合并 int moveset(int p,int q);//把p移出原集合到q的集合中 int queryset(int p);//查找并输出相应的和与个数 int pa[maxn*2];//每个节点的父节点 int sum[maxn*2];//每个父节点对应的集合的所有元素之和 int num[maxn*2];//每个父节点对应的集合的所有元素的个数 int n,m; int findset(int x){return pa[x]!=x?pa[x]=findset(pa[x]):x;}//并查集查找 int main() { // freopen("a.txt","r",stdin); while(scanf("%d %d",&n,&m)==2) { for(int i=1;i<=n;i++) { pa[i]=i+maxn; pa[i+maxn]=i+maxn; sum[pa[i]]=i; num[pa[i]]=1; } int op,p,q; for(int i=1;i<=m;i++) { scanf("%d",&op); switch(op)//根据第一个数字来执行相应的命令 { case 1:scanf("%d %d",&p,&q); unionset(p,q); break; case 2:scanf("%d %d",&p,&q); moveset(p,q); break; case 3:scanf("%d",&p); queryset(p); break; } } } } int unionset(int p,int q)//把p q所在的集合合并 { int fp,fq;//p q 的根节点 fp=findset(p);fq=findset(q); if(fp!=fq) { pa[fq]=fp; sum[fp]+=sum[fq]; num[fp]+=num[fq]; } return 1; } int moveset(int p,int q)//把p移出原集合到q的集合中 { int fp,fq; fp=findset(p);fq=findset(q); if(fp!=fq) { pa[p]=fq;//把p的父亲设置为fq,由于构造不会使得p是根节点,因为根节点大于maxn sum[fp]-=p;num[fp]--; sum[fq]+=p; num[fq]++; } return 1; } int queryset(int p)//查找并输出相应的和与个数 { int fp=findset(p); printf("%d %d\n",num[fp],sum[fp]); return 0; }
相关文章推荐
- POJO与JSON的序列化与反序列化
- 团队冲刺第一阶段第六天
- 【前端】加密算法MD5、SHA1、Base64实测
- 通过js看类似C#中的回掉
- try catch
- 数据库事务隔离级别
- leetcode80. Remove Duplicates from Sorted Array II
- 解决新安装的CodeBlocks无法编译运行问题
- 大众点评订单分库分表实践
- 任务分配-dfs
- poj 1556(迪杰斯特拉+计算几何)
- hdu 1003,nefu 728 max sum
- android串口通信以及串口协议解析
- Android-项目结构-day01
- HDU 1051 Wooden Sticks
- 第 6章 函数
- DSP 连不上 JTAG, 'SC_ERR_PATH_BROKEN', 关注EMU1 EMU0
- NOIP 2008 双栈排序
- redis之数据结构--上
- authentication token manipulation error