您的位置:首页 > 其它

hdu 1272 小希的迷宫(判断成环)

2015-11-17 23:31 330 查看
题目链接: hdu 1272 小希的迷宫

题意:若整个无向图连通,并且不成环,则输出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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: