hdu 1272 小希的迷宫(判断成环)
2015-11-17 23:31
330 查看
题目链接: hdu 1272 小希的迷宫
题意:若整个无向图连通,并且不成环,则输出Yes,否则输出No
判断成环:
若两个点的祖宗相同,并且这两个点相连,则说明成环
整个无向图连通,表明只有一个根节点
题意:若整个无向图连通,并且不成环,则输出Yes,否则输出No
判断成环:
若两个点的祖宗相同,并且这两个点相连,则说明成环
整个无向图连通,表明只有一个根节点
#include<iostream> #include<cstdio> #include<cstring> #define maxn 111111 using namespace std; int father[maxn]; int Find(int x) { if(father[x]==x) return x; father[x]=Find(father[x]); return father[x]; } int Merge(int x,int y) { x=Find(x); y=Find(y); if(x!=y) father[x]=y; } bool same(int x,int y)//判断是否成环 { return Find(x)==Find(y)?1:0; } int main() { int x,y,flag = 0,Max=-1; while(scanf("%d%d",&x,&y)) { Max=-1;//Max用来记录最大的那个数 if(x==-1&&y==-1) break; if(x==0&&y==0)//大坑点,输入0,0时输出要是Yes { printf("Yes\n"); continue; } flag = 0; memset(father,0,sizeof(father));//因为不知道哪些数有用,所以一开始不能初始化为本身 do { if(!father[x]) father[x]=x;//输入的数即为有用的数,若该数的父亲为零,则表示以前没访问过,则初始化为它的本身 if(!father[y]) father[y]=y; int Max1=max(x,y); Max=max(Max,Max1);//不断找最大值 if(!same(x,y)) Merge(x,y);//若不是共同的祖先, 则合并 else flag =1;//否则制标记为1 scanf("%d%d",&x,&y); }while(x&&y); int sum=0; for(int i=1;i<=Max;i++) if(father[i]==i) sum++; if(sum!=1) flag =1;//若要全部连通,则根只有一个 // cout<<sum<<endl; if(flag) printf("No\n"); else printf("Yes\n"); } return 0; }
相关文章推荐
- Linux_文件系统、磁盘分区_RHEL7
- 成为Android高手必须掌握的8项基本要求
- Centos安装smokeping教程
- 解决百度地图com.baidu.platform.comjni.map.commonmemcache.JNICommonMemCache.Create:()J问题
- 南大软院大神养成计划--php
- 2016创业五大风向标:看十大硅谷前沿公司都在做什么?
- js-案例:省市连动下拉框
- Java反射探索-----从类加载说起
- MFC 创建非模态对话框和销毁过程
- 刷题记录2015.11.17
- 南大软院大神养成计划--day02
- Struts2在Action中访问WEB资源
- ASP.NET跨平台最佳实践
- Struts2在Action中访问WEB资源
- C语言练习作业(四)
- ios应用开发中plist的读写(Swift)
- 解决dpkg: ../../src/packages.c:227: process_queue: Assertion `dependtry <= 4' failed
- 上下文学习
- 南昌大学软件学院大神养成计划脚印-11.17
- HDU 5534 (多重背包)