您的位置:首页 > 其它

HDU 1272 小希的迷宫

2013-04-09 14:14 302 查看
并查集判断连通和环路,注意输入如果是只有0 0 要输出yes

代码有点臭

#include <iostream>
#include <cstdio>
using namespace std;
const int maxn=100010;
int id[maxn],size[maxn],n;
bool in[maxn];
int find(int p){
return p==id[p]?p:id[p]=find(id[p]);
}
bool uni(int p,int q){
int pp=find(p),pq=find(q);
if(pp==pq)return false;
if(size[pp]>size[pq]){
id[pq]=pp;
size[pp]+=size[pq];
}else{
id[pp]=pq;
size[pq]+=size[pp];
}
return true;
}
void clear(){
for (int i=1;i<maxn;++i){
id[i]=i;
size[i]=1;
in[i]=0;
}
}
int main(){
int u,v;
while (scanf("%d%d",&u,&v))
{
if(u==-1&&v==-1)break;
int f=0,f2=0,maxi=0;
clear();
while (u!=0&&v!=0)
{
f2++;
in[u]=1;
in[v]=1;
maxi=max(maxi,max(u,v));
if(!f&&!uni(u,v)){
f=1;
}
scanf("%d%d",&u,&v);
}
if(f2==0){
printf("Yes\n");
}
else if(f==0){
int cnt=0;
for (int i=1;i<=maxi;++i)
{
if(in[i]&&id[i]==i)cnt++;
}
if(cnt==1)printf("Yes\n");
else printf("No\n");
}else{
printf("No\n");
}

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