通过数据要判断俩点:
1、要保证每个点都相通,2、两点之间只有一条路径相通
方法:
1、判断连通图,即ans<=1,就是只有一个父节点,2、flag=1,即任意两点的父节点不能相同
#include <stdio.h>
#include <string.h>
#define N 100001
struct d{
int x;
int y;
}buf[N];
int flag;
int parent[N];
bool judge[N];
int find(int x) {
return x==parent[x] ? x : find(parent[x]);
}
void uni(int x, int y) {
judge[x] = true;
judge[y] = true;
int a = find(x);
int b = find(y);
if(a==b)
flag = 0;//若两点的父节点相同,则 flag=0
else
parent[a] = b;
}
void init() {
memset(judge, 0, sizeof(judge));
flag = 1;
for(int j=0; j<N; j++)
parent[j] = j;
}
int main() {
//freopen("m://in.txt", "r", stdin);
int x, y, i, ans;
while(~scanf("%d%d", &x, &y) && x!=-1 && y!=-1) {
if(!x && !y) {
ans = 0;
for(i=0; i<N; i++) {
if(judge[i] && parent[i]==i)
ans ++;
}
if(flag && ans<=1)
printf("Yes\n");
else
printf("No\n");
init();
continue;
}
uni(x, y);
}
return 0;
}