POJ题目网址:http://poj.org/problem?id=1308
HDU题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1272
并查集的运用,如果想要形成一棵树,那么我们应该只能有一个根,并查集联合次数为节点数-1。
//Asimple
//#include <bits/stdc++.h>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <cctype>
#include <cstdlib>
#include <stack>
#include <cmath>
#include <set>
#include <map>
#include <string>
#include <queue>
#include <limits.h>
#include <time.h>
#define INF 0xfffffff
#define mod 10007
#define swap(a,b,t) t = a, a = b, b = t
#define CLS(a, v) memset(a, v, sizeof(a))
#define debug(a) cout << #a << " = " << a <<endl
#define abs(x) x<0?-x:x
using namespace std;
typedef long long ll;
const int maxn = ;
int fa[maxn];
//int re[maxn];
int n, m, T, x, y, num, len;
set<int> s;
bool f; void init() {
for(int i=; i<maxn; i++) fa[i] = i;
f = false;
len = ;
s.clear();
} int find(int x) {
return fa[x]==x?x:fa[x]=find(fa[x]);
} void make_set(int x, int y) {
if( x==y ) f = true;
x = find(x);
y = find(y);
if( x!=y ){
fa[x] = y;
len ++;
} else f = true;
} void solve() { } void input() {
int cas = ;
while( true ) {
init();
cin >> x >> y;
if( x == && y == ) {
// cout << "Case "<< cas++ <<" ";
// puts("is a tree.");
puts("Yes");
continue;
}
if( x==- && y==- ) break;
s.insert(x);
s.insert(y);
make_set(x, y);
while( cin >> x >> y ) {
if( x== && y == ) break;
s.insert(x);
s.insert(y);
make_set(x, y);
}
// cout << "Case "<< cas++ <<" ";
if( len+ == s.size() && !f ) puts("Yes");
else puts("No");
}
} int main() {
input();
return ;
}