HDU 1272 并查集
2016-03-25 11:26
417 查看
1.没有环
2.必须联通(有点类似“最小生成树”&…&)
1.创建集合(用树表示),每输入一对边就加入到集合中(成为树的子节点),如果输入的这条边两个定点都已经在同一集合中,说明出现了环
2.要满足题意:必须使
最后有且只有一个集合。说明所有的节点的根都是相同的。
并查集模版:
2.必须联通(有点类似“最小生成树”&…&)
1.创建集合(用树表示),每输入一对边就加入到集合中(成为树的子节点),如果输入的这条边两个定点都已经在同一集合中,说明出现了环
2.要满足题意:必须使
最后有且只有一个集合。说明所有的节点的根都是相同的。
并查集模版:
int p[maxn],r[maxn]; void init() { for(int i=0;i<=maxn;i++) { p[i]=i;r[i]=0; } } int find(int x) //路径压缩 { if(x==p[x]) return x; else return p[x]=find(p[x]); } int add(int x,int y) //按秩合并 { x=find(x); y=find(y); if(x==y) return -1; if(r[x]>r[y]) p[y]=x; else { p[x]=y; if(r[x]==r[y]) r[y]++; } return 1; }完整代码如下:
#include <iostream> #include <stdio.h> #include <string.h> using namespace std; int p[100005]; int r[100005]; int c[100005]; int find(int x) { if(x==p[x]) return x; else return p[x]=find(p[x]); } int add(int x,int y) { x=find(x); y=find(y); if(x==y) return -1; if(r[x]>r[y]) p[y]=x; else { p[x]=y; if(r[x]==r[y]) r[y]++; } return 1; } int main() { int x,y; bool fag; while(~scanf("%d%d",&x,&y)) { if(x==0 && y==0) { printf("Yes\n"); continue; } fag=true; for(int i=0;i<=100000;i++) p[i]=i; memset(r,0,sizeof(r)); if(x==-1 && y==-1) break; p[x]=y; r[y]++; c[0]=x;c[1]=y; int k=2; while(scanf("%d%d",&x,&y)) { if(x==0 && y==0) break; c[k++]=x; //这个地方其实可以去重,懒得去了 c[k++]=y; if(add(x,y)==-1) fag=false; } if(!fag) { printf("No\n"); continue;} int f=find(c[0]); for(int i=1;i<k;i++) { if(find(c[i]) != f) { fag=false; break; } } if(!fag) printf("No\n"); else printf("Yes\n"); } return 0; }
相关文章推荐
- iOS开发 - MagicalRecord
- iOS开发 - Coredata
- MATCH_PARENT与FILL_PARENT:不要做什么和怎么做
- poj 2151 Check the difficulty of problems(概率DP)
- MS-SQL索引类型
- shell-数组
- python中lambda的用法
- iOS开发 - 单例&线程锁
- linux printf设置颜色与输出控制,利用控制码,实现固定位置输出百分比进度
- Android APK加壳技术方案
- AD使用汇总AD09
- leetcode @python 117. Populating Next Right Pointers in Each Node II.py
- git常用命令之git pull使用说明
- 交易信息被篡改 错误码:CONTEXT_INCONSISTENT
- TextView的实现原理介绍
- IE11 自动四舍五入
- @RequestMapping value 可以重复吗 [
- MySQL权限篇之CREATE USER
- 1.3iOS支持多语言(含demo)
- sublime text 2中的emmet插件的安装和使用