您的位置:首页 > 其它

hdu 1272 小希的迷宫

2014-05-08 21:17 267 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1272

#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 50000
using namespace std;

int in[maxn*4],f[maxn*4];
bool ha[maxn*4];
int max1;

struct node
{
int u,v;
}p[maxn*4];

void inti()
{
for(int i=1; i<=max1; i++)
{
f[i]=i;
}
}

int find1(int x)
{
if(x==f[x]) return x;
return f[x]=find1(f[x]);
}

void union1(int a,int b)
{
int fa=find1(a);
int fb=find1(b);
if(fa!=fb)
{
f[fb]=fa;
}
}

int main()
{
int case1=1;
while(scanf("%d%d",&p[0].u,&p[0].v)!=EOF)
{
if(p[0].u<0||p[0].v<0) break;
if(p[0].u==0&&p[0].v==0)
{
printf("Yes\n",case1++);
continue;
}
memset(in,0,sizeof(in));
memset(ha,false,sizeof(ha));
max1=0;
max1=max(max1,p[0].u);
max1=max(max1,p[0].v);
ha[p[0].u]=ha[p[0].v]=true;
in[p[0].v]++;
int m=1;
while(scanf("%d%d",&p[m].u,&p[m].v))
{
if(p[m].u==0&&p[m].v==0) break;
in[p[m].v]++;
ha[p[m].u]=ha[p[m].v]=true;
max1=max(max1,p[m].u);
max1=max(max1,p[m].v);
m++;
}
bool flag1=false;
int m1=0;
for(int i=1; i<=max1; i++)
{
if(ha[i]&&in[i]>1)
{
flag1=true;
break;
}
}
for(int i=1; i<=max1; i++)
{
if(ha[i]&&in[i]==0) m1++;
}
if(flag1||m1!=1)
{
printf("No\n",case1++);
continue;
}
inti();
for(int i=0; i<m; i++)
{
union1(p[i].u,p[i].v);
}
int ans=0;
for(int i=1; i<=max1; i++)
{
if(ha[i]&&f[i]==i) ans++;
}
if(ans!=1) printf("No\n",case1++);
else
printf("Yes\n",case1++);
}
return 0;
}


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