题意:判断一张图是否联通且无环。
若一条边的两个节点为同一个父节点,则成环。若所有的节点的父节点相同则联通。注意输入0 0时为Yes。
拓展:改为有向图hdu1325
#include <iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define N 110000
using namespace std;
int flag,pre[N],vis[N],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);
}
}