您的位置:首页 > 其它

HDU-1272 小希的迷宫 (并查集、判断图是否为树)

2015-07-28 09:47 519 查看
Description

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

# include<iostream>
# include<cstdio>
# include<algorithm>
# include<cstring>
# include<set>
using namespace std;
const int N=1000005;
struct edge
{
int fr,to;
};
edge e
;
int pre
,n,cnt;
int mark
;
void add(int u,int v)
{
e[cnt].fr=u;
e[cnt].to=v;
++cnt;
}
int find(int x)
{
int u=x;
while(pre[u]!=-1)
u=pre[u];
int v;
while(pre[x]!=-1){
v=x;
x=pre[x];
pre[v]=u;
}
return u;
}
bool ok()
{
memset(pre,-1,sizeof(pre));
for(int i=0;i<cnt;++i){
int u=find(e[i].fr);
int v=find(e[i].to);
//cout<<e[i].fr<<' '<<e[i].to<<' '<<u<<' '<<v<<endl;
if(u==v)
return false;
pre[u]=v;
}
return true;
}
int main()
{
int a,b;
while(scanf("%d%d",&a,&b))
{
if(a==-1&&b==-1)
break;
if(a==0&&b==0){
printf("Yes\n");
continue;
}
cnt=0;
memset(mark,0,sizeof(mark));
int num=0;
mark[a]=mark[b]=1;
num+=2;
add(a,b);
//add(b,a);
while(scanf("%d%d",&a,&b),a+b){
if(!mark[a])
++num;
if(!mark[b])
++num;
mark[a]=mark[b]=1;
add(a,b);
//add(b,a);
}
//cout<<cnt/2<<' '<<num-1<<endl;
if(cnt==num-1&&ok())
printf("Yes\n");
else
printf("No\n");
}
return 0;
}


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