hdu1272(并查集)
2015-12-25 23:24
323 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1272
思路:
1、判断所有点是否联通,用边数=顶点数-1 来判断
2、判断有没成环,用并查集来判断两个点是否联通,如果已经联通,则会成环。
3、特判 直接读入空图即,a==0&&b==0 输出Yes
代码:
思路:
1、判断所有点是否联通,用边数=顶点数-1 来判断
2、判断有没成环,用并查集来判断两个点是否联通,如果已经联通,则会成环。
3、特判 直接读入空图即,a==0&&b==0 输出Yes
代码:
#include<cstdio> #include<cstring> const int N=100000+5; int fa ,vis ; int flag=1; int cnt=0; //记录顶点数 int sc=0;// 输出判定问题 void init(){ for(int i=0;i<=N;i++)fa[i]=i; memset(vis,0,sizeof(vis)); flag=1; cnt=0; sc=0; } int find(int x){ if(fa[x]!=x)return fa[x]=find(fa[x]); return fa[x]; } int main() { int a,b; init(); while(scanf("%d%d",&a,&b)!=EOF) { if(a==-1&&b==-1)break; if(a==0&&b==0){ if(!sc) {printf("Yes\n");init();continue;} //如果没有输入0 0以外的数的话即为空图,直接输出Yes int sv=0; if(!flag) {printf("No\n");init();continue;} for(int i=1;i<N;i++) if(vis[i]) { sv++; } if(flag&& sv==cnt+1) printf("Yes\n"); else printf("No\n"); init(); continue; } if(flag){ sc=1; vis[a]=1,vis[b]=1; a=find(a),b=find(b); if(a!=b) fa[a]=b,cnt++; else flag=0; } } return 0; }
相关文章推荐
- HDU-1213-How Many Tables
- Longest Consecutive Sequence,Distinct Subsequences,Interleaving String,Scramble String
- SARS病毒传染 并查集
- HDU 1213
- CSU1307 并查集+SPFA
- BestWiring——Kruskal算法&并查集
- 1611:The Suspects
- poj3728
- HDU-1233 还是畅通工程(最小生成树&并查集)
- Simon-【深入理解数据结构】有根树的不同实现① —— 并查集
- 家族
- poj 1417 True Liars 解题报告 并查集 DP
- poj 1161
- 并查集——HDOJ 1213How Many Tables解题报告
- 最小生成树——HDOJ 2988 Dark roads解题报告
- HDU 1198 Farm Irrigation(并查集)
- hdu 1213 How Many Tables(并查集,简单题)
- hud 1233 还是畅通工程( kruskal和prim两种方法)
- hdu 1863 畅通工程 (最小生成树kruskal 算法)
- hdu 1213并查集