您的位置:首页 > 其它

HDU 1272-小希的迷宫 并查集初级

2014-02-18 19:47 357 查看
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#define maxn 100010
using namespace std;
int father[maxn],mark[maxn];
int flag;
void init()//初始化
{
for(int i=0;i<maxn;i++)
{
father[i]=i;
mark[i]=0;
}
}
int find(int x)//查找根
{
int r=x;
while(r!=father[r])
{
r=father[r];
}
return r;
}
void con(int x,int y)//建立联系
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
{
father[fx]=fy;
}
}
int main()
{
int a,b,i;
while(scanf("%d%d",&a,&b)!=EOF&&(a!=-1||b!=-1))
{
if(a==0&&b==0)
{
cout<<"Yes"<<endl;
continue;
}
init();
int max=-1,min=maxn,num=0;
flag=0;
while(a||b)
{
if(a>max)
{
max=a;
}
if(b>max)
{
max=b;
}
if(a<min)
{
min=a;
}
if(b<min)
{
min=b;
}
mark[a]=1;mark[b]=1;
int fa=find(a);
int fb=find(b);
if(fa==fb)//本身就已经连接,这是第二条通路,所以不符合
{
flag=1;
}
else
{
con(fa,fb);
}
scanf("%d%d",&a,&b);
}
if(flag==1)
{
cout<<"No"<<endl;
}
else
{
for(i=min;i<=max;i++)
{
if(mark[i]==1&&father[i]==i)//没有孤点
{
num++;
}
}
if(num==1)//仅有一个特殊点
{
cout<<"Yes"<<endl;
}
else
{
cout<<"No"<<endl;
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: