杭电acm1272
通过数据要判断俩点:
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; }