小希的迷宫(并查集)
2018-01-30 08:57
99 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1272
分析:
1、判断是否成环
2、判断是否连通
如何判断成环 即两个连通的点有相同的公共结点时 此时成环
这个输入输出格式 只能 Orz
AC代码:
分析:
1、判断是否成环
2、判断是否连通
如何判断成环 即两个连通的点有相同的公共结点时 此时成环
这个输入输出格式 只能 Orz
AC代码:
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; int pre[100005]; int num[100005];// 用于标记出现的点 int find(int n){ int r=n; while (pre[r]!=r){ r=pre[r]; } int i=n; int temp; while (i!=r){ temp=pre[i]; pre[i]=r; i=temp; } return r; } int jion(int x,int y){ int fx=find(x); int fy=find(y); if (fx!=fy) pre[fx]=fy; else return 0;// 两点有公共结点 成环 return 1; } void init(){// 初始化 for (int i=0;i<=100001;i++) pre[i]=i; } int main (){ int a,b; int len=0; int flag=1; int maxn=-1; init(); memset(num,0,sizeof(num)); while (scanf ("%d%d",&a,&b)&&(a!=-1&&b!=-1)){ if(a!=0&&b!=0){ num[a]=1;// 点出现 num[b]=1; maxn=max(max(a,b),maxn);// 点中的最大值 if(!jion(a,b)) flag=0; } if(a==0&&b==0){// int sum=0; for (int i=1;i<=maxn;i++){ if (num[i])// 找到出现的点 if(find(i)==i) sum++; } if(sum>1)// 有多个根节点 不连通 flag=0; if(flag) printf ("Yes\n"); else printf ("No\n"); flag=1; maxn=-1; init(); memset(num,0,sizeof(num)); } } return 0; }
相关文章推荐
- HDU1272 小希的迷宫 并查集
- 小希的迷宫——并查集
- 并查集杭电1272小希的迷宫
- hdu 小希的迷宫(并查集)(连通无环图)
- hdu_1272_小希的迷宫 (并查集)
- 杭电 hdu 1272 小希的迷宫【并查集】
- HDU1272 小希的迷宫 并查集判环
- HDU 1272 小希的迷宫(并查集)
- hdu 1272 小希的迷宫(利用树的性质和并查集判断树)
- Hud 1272 小希的迷宫[并查集]
- HDOJ 1272 小希的迷宫(并查集)
- hdoj 1727 小希的迷宫 (并查集问题)
- HDU 1272 小希的迷宫 并查集
- 【并查集】-HDU1272-小希的迷宫
- HDU 1272 小希的迷宫 并查集 (判断任意2个点是否有且仅有一条路径可以相通)
- hdu 1272 小希的迷宫(并查集)
- ACM-并查集之小希的迷宫——hdu1272
- HDU - 1272 小希的迷宫 (并查集)
- HDU1272 小希的迷宫(基础并查集)
- 小希的迷宫——并查集