http://acm.hdu.edu.cn/showproblem.php?pid=1272
分析:
1、判断是否成环
2、判断是否连通
如何判断成环 即两个连通的点有相同的公共结点时 此时成环
这个输入输出格式 只能 Orz
AC代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int pre[100005];
int num[100005];// 用于标记出现的点
int find(int n){
int r=n;
while (pre[r]!=r){
r=pre[r];
}
int i=n;
int temp;
while (i!=r){
temp=pre[i];
pre[i]=r;
i=temp;
}
return r;
}
int jion(int x,int y){
int fx=find(x);
int fy=find(y);
if (fx!=fy)
pre[fx]=fy;
else
return 0;// 两点有公共结点 成环
return 1;
}
void init(){// 初始化
for (int i=0;i<=100001;i++)
pre[i]=i;
}
int main (){
int a,b;
int len=0;
int flag=1;
int maxn=-1;
init();
memset(num,0,sizeof(num));
while (scanf ("%d%d",&a,&b)&&(a!=-1&&b!=-1)){
if(a!=0&&b!=0){
num[a]=1;// 点出现
num[b]=1;
maxn=max(max(a,b),maxn);// 点中的最大值
if(!jion(a,b))
flag=0;
}
if(a==0&&b==0){//
int sum=0;
for (int i=1;i<=maxn;i++){
if (num[i])// 找到出现的点
if(find(i)==i)
sum++;
}
if(sum>1)// 有多个根节点 不连通
flag=0;
if(flag)
printf ("Yes\n");
else
printf ("No\n");
flag=1;
maxn=-1;
init();
memset(num,0,sizeof(num));
}
}
return 0;
}