hdu 1272 小希的迷宫
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXN 100005
int father[MAXN];
bool exist[MAXN];
int find(int x)
{
int i,t;
for(i=x; father[i]>0; i=father[i]) ;
while(x!=i)
{
t=father[x];
father[x]=i;
x=t;
}
return i;
}
bool merge(int x,int y)
{
int fx=find(x),fy=find(y);
// printf("x=%d y=%d fx=%d fy=%d\n",x,y,fx,fy);
if(fx==fy) return false;
// if(father[y] > 0) return false;
// father[fy]=fx;
if(father[fx]>father[fy])
{
father[fy]+=father[fx];
father[fx]=fy;
}
else
{
father[fx]+=father[fy];
father[fy]=fx;
}
return true;
}
int main()
{
int i,j,maxid;
while(scanf("%d %d",&i,&j) && (i!=-1 && j!=-1))
{
// if(i<0) break;
memset(father,-1,sizeof(father));
memset(exist,false,sizeof(exist));
maxid=-1;
bool ok=true;
while(i+j)
{
if(ok)
{
ok=merge(i,j);
exist[i]=exist[j]=true;
if(i>maxid) maxid=i;
if(j>maxid) maxid=j;
}
scanf("%d %d",&i,&j);
}
for(i=1; i<=maxid; i++)
if(exist[i]) break;
int fi=find(i++);
while(i<=maxid)
{
if(exist[i] && find(i) != fi)
{
ok=false;
break;
}
i++;
}
if(ok) printf("Yes\n");
else printf("No\n");
}
return 0;
}
浙公网安备 33010602011771号