题意:
判断连通无环图。DFS或者并查集。
无环: 判断成环的时候,只要判断输入边的两个点。有一个共同的父节点,那么这两个点就成环。
连通:根节点数是1
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 1e5+10;
int father[MAXN];
bool vis[MAXN];
bool flag;
void init()
{
memset(vis,false,sizeof(vis));
for(int i=1;i<MAXN;i++)
father[i]=i;
}
int find(int x)
{
while(x!=father[x]) x = father[x];
return x;
}
void Union(int x,int y)
{
x = find(x);
y = find(y);
if(x!=y) father[x]=y;
else flag = false;
}
int main()
{
int i,a,b;
while(cin>>a>>b)
{
if(a==-1&&b==-1) break;
if(a==0&&b==0)
{
cout<<"Yes"<<endl;
continue;
}
init();
vis[a]=vis[b]=true;
flag = true;
Union(a,b);
while(cin>>a>>b)
{
if(a==0&&b==0) break;
Union(a,b);
vis[a]=vis[b]=true;
}
int cnt=0;
for(int i=1;i<MAXN;i++)
{
if(vis[i]&&father[i]==i)
{
cnt++;
}
if(cnt>1) flag = false;
}
if(flag) printf("Yes\n");
else printf("No\n");
}
return 0;
}