hdu 1272 小希的迷宫
要点: 任意两个房间有且仅有一条路径可以相通。
1.不能形成环。
2.只能有一棵树,不能有多颗树。
//1272 并查集 已过
#include<iostream>
#include<string.h>
using namespace std;
#define Maxn 100005
int pre[100005];
int used[Maxn];
int m,flag;
int find(int x)
{
while(pre[x]!=x)
{
x=pre[x];
}
//int i=x,j;
//while(i!=r)
//{
// j=pre[i];
// pre[i]=r;
// i=j;
//}
return x;
}
int join(int x,int y)
{
int fx=find(x),fy=find(y);
if(fx==fy)
return 0;
else
pre[fx]=fy;
return 1;
}
int main()
{
int t;//t表示当前点数和边数的差值; flag表示有几个根 有一个根代表是联通的
int m,n;
while(scanf("%d %d",&m,&n)==2)
{
if(m==-1&&n==-1) return 0;
if(m==0&&n==0)
{
cout<<"Yes"<<endl;
continue;
}
for(int i=1;i<Maxn;i++)
pre[i]=i;//必须每次都有
memset(used,0,100005*sizeof(int));
//cout<<m<<n<<endl;
join(m,n);
used[m]=1;
used[n]=1;
// cout<<used[m]<<m<<" "<<used[n]<<" "<<endl;
t=1;
flag=1;
// cout<<flag<<endl;
while(scanf("%d %d",&m,&n)!=EOF)
{
if(m==0&&n==0) break;
if(used[m]==0)
{
t++;
used[m]=1;
//cout<<m<<" "<<t<<"$"<<endl;
}
if(used[n]==0){
t++;
used[n]=1;
//cout<<t<<"*";
}
if(join(m,n)==0)
{
flag=0;
//cout<<m<<" "<<n<<" "<<flag<<endl;
}
else
t--;
//cout<<m<<" "<<n<<" "<<t<<"#"<<endl;
}
//cout<<flag<<" "<<t<<endl;
if(flag&&t==1)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}
新手,请多多指教