您的位置:首页 > 其它

HDUOJ------(1272)小希的迷宫

2013-11-02 22:38 232 查看

小希的迷宫

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 21080 Accepted Submission(s): 6449

[align=left]Problem Description[/align]
上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走。但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道连通了房间A和B,那么既可以通过它从房间A走到房间B,也可以通过它从房间B走到房间A,为了提高难度,小希希望任意两个房间有且仅有一条路径可以相通(除非走了回头路)。小希现在把她的设计图给你,让你帮忙判断她的设计图是否符合她的设计思路。比如下面的例子,前两个是符合条件的,但是最后一个却有两种方法从5到达8。

#include<iostream>
#include<vector>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
const int maxn=100001;
int father[maxn+2],rank[maxn+2];
struct nod
{
nod(int m,int n):a(m),b(n){};
int a,b;
};
void init(int n)
{
for(int i=1;i<=n;i++)
{
father[i]=i;
rank[i]=1;
}
}
int setfind(int x)
{
/*如果root不为自己,那就去找最原始的root*/
if(x!=father[x])
{
father[x]=setfind(father[x]);
}
return father[x];
}
void collect(int x, int y)
{
x=setfind(x);
y=setfind(y);
if(x!=y)
{
if(rank[x]>rank[y])
{
father[y]=x;
rank[x]+=rank[y];
}
else
{
father[x]=y;
rank[y]+=rank[x];
}
}
}

int main()
{
int a,b,max,i;
/*freopen("test.in","r",stdin);*/
while(1)
{
vector<nod>sa;
max=0;
scanf("%d%d",&a,&b);
if(a==-1&&b==-1)
return 0;
while(a+b)
{
int temp=a>b?a:b;
if(max<temp)
max=temp;
nod str(a,b);
sa.push_back(str);
scanf("%d%d",&a,&b);
}
int len=sa.size();
if(len==0)
{
puts("Yes");
continue;
}
init(max);
vector<nod>::iterator it;
for(it=sa.begin();it!=sa.end();it++)
{
/*printf("%d%d",(*it).a,it->b);*/
collect((*it).a,it->b);
}
int anst=0,pos,ansa=0;

for( i=1;i<=max;i++)
{
/*  printf("%d",father[i]);*/
if(anst<rank[i])
{
anst=rank[i];
pos=i;    /*确定root*/
}
if(father[i]!=i)
ansa++;
}
if(anst==ansa+1)   /*是一棵树*/
{
bool tag=true;
for(i=1;i<=max;i++)
{
/*是否有循环的树*/
if(father[i]!=pos&&father[i]!=i)
{
tag=false;
break;
}
}
if(tag)
printf("No\n");
else
printf("Yes\n");
}
else
printf("No\n");
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: