题目链接:hdu 1272
大概题意:并查集简单运用,用点数 - 边数 == 1 判断是否有环
代码:
#include<cstdio> #include<cstring> using namespace std; #define maxn 100010 int cnt; int node[maxn]; int vis[maxn]; int F[maxn]; int find(int x) { if(F[x] == -1) return x; return F[x] = find(F[x]); } void bing(int x, int y) { int p1 = find(x); int p2 = find(y); if(p1 != p2) F[p1] = p2; } int main() { int a, b; bool end = false; while(true){ cnt = 0; int edge_num = 0; memset(vis, 0, sizeof(vis)); memset(F, -1, sizeof(F)); while(true){ scanf("%d%d", &a, &b); if(a == -1 && b == -1){ end = true; break; } if(a == 0 && b == 0) break; if(vis[a] == false){ vis[a] = true; node[cnt] = a; cnt++; } if(vis[b] == false){ vis[b] = true; node[cnt] = b; cnt++; } edge_num++; bing(a, b); } if(end) break; int rt = find(node[0]); bool yeah = true; for(int i = 1; i < cnt; i++){ int v = node[i]; if(find(v) != rt) { yeah = false; break; } } if(yeah && cnt - edge_num == 1) printf("Yes\n"); else if(yeah && cnt == 0) printf("Yes\n"); else printf("No\n"); } return 0; }