您的位置:首页 > 其它

hdu 1272 小希的迷宫 并查集

2016-04-12 21:51 441 查看
题意:判断一张图是否联通且无环。

若一条边的两个节点为同一个父节点,则成环。若所有的节点的父节点相同则联通。注意输入0 0时为Yes。

拓展:改为有向图hdu1325

#include <iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define N 110000

using namespace std;

int flag,pre
,vis
,maxn;

void init()
{
for(int i=0;i<N;i++)   pre[i]=i;
flag=1;
maxn=0;
memset(vis,0,sizeof(vis));
}

int findset(int v)
{
int t1,t2=v;
while(v!=pre[v])    v=pre[v];
while(t2!=v)
{
t1=pre[t2];
pre[t2]=v;
t2=t1;
}
return v;
}

void unions(int u,int v)
{
int t1=findset(u);
int t2=findset(v);
if(t1==t2)  flag=0;
else    pre[t1]=t2;
}

int main()
{
int u,v;
init();
while(~scanf("%d%d",&u,&v)&&!(u==-1&&v==-1))
{
if(u==0&&v==0)
{
int tp=0;
for(int i=1;i<=maxn;i++)
if(vis[i]&&pre[i]==i)   tp++;
if(flag&&tp<=1)    cout<<"Yes"<<endl;
else    cout<<"No"<<endl;
init();
continue;
}
vis[u]=vis[v]=1;
maxn=max(maxn,max(u,v));
if(u!=v)    unions(u,v);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: