poj 1308 Is It A Tree? 并查集
题意:给你一些边,判断这些边能否构成一棵树。
分析:并查集,但是得注意:
1.可能存在自环 2.每个数据开始输入为0 0 的时候也算一棵树
View Code
#include <cstdio> #include <cstring> #include <iostream> using namespace std; #define re(i,n) for(int i=0;i<n;i++) #define re1(i,n) for(int i=1;i<=n;i++) const int maxn = 110; int p[maxn]; int flag[maxn]; inline void init() { re(i,maxn) p[i] = i; } int find(int x) { return x == p[x] ? x : p[x] = find(p[x]); } void Union(int x , int y) { int a =find(x) , b = find(y); p[a] = p[b] = p[x] = p[y] = min(a , b); } int main() { int x , y , cas = 1 ,tmp; while(~scanf("%d%d",&x,&y) && x!=-1) { if( !x && !y ) { printf("Case %d is a tree.\n",cas ++);continue; } memset(flag,0,sizeof(flag)); init(); tmp = x; int ok = 1; flag[x] = flag[y] = true; if(x == y) ok = 0; else Union(x , y); while(scanf("%d%d",&x,&y) && x) { if(!ok) continue; flag[x] = flag[y] = true; if(find(x) != find(y)) Union(x , y); else ok = 0; } if(ok) { re1(i,maxn-1) if(flag[i] && find(tmp) != find(i)) { ok = 0 ;break; } } printf(ok ? "Case %d is a tree.\n" : "Case %d is not a tree.\n" , cas ++); } return 0; }