题意:你懂得。
析:根据题意我们应该知道是首先是不能含有环的,如果含有环那么路径就不唯一,其次要连通,因为如果不连通,那么有的结点就无法相连,
就不满足,仅有一条路径的条件了,判环用并查集,非常方便,在输入时要判断是这条边是不是已经连通了,如果已经连通了那么肯定就是环了,
也就不符合题意了,其次就是要判断是不是都连通,可以通过是不是一个根结点来判,其次我用的是离散上的知识,判断是不是树的条,很明显,
没有环,又全连通就是树的呗,也就是结点减一等于的边数。再就是这个题有一个坑,输入0 0要输出Yes,刚开始WA了一次。
代码如下:
#include <iostream> #include <cstdio> #include <algorithm> #include <vector> #include <set> #include <cstring> #include <cmath> using namespace std; typedef long long LL; const int INF = 0x3f3f3f3f; const int maxn = 100000 + 5; int p[maxn]; set<int> s; int Find(int x){ return x == p[x] ? x : p[x] = Find(p[x]); } int main(){ int u, v, num; while(scanf("%d %d", &u, &v) == 2 && u+v >= 0){ if(!u && !v){ puts("Yes"); continue; } num = 1; bool ok = true; s.clear(); for(int i = 0; i < maxn; ++i) p[i] = i; p[v] = u; s.insert(u); s.insert(v); while(scanf("%d %d", &u, &v) == 2 && u+v){ int x = Find(u); int y = Find(v); if(x != y) p[y] = x; else ok = false; s.insert(u); s.insert(v); ++num; } if(ok && num == s.size()-1) puts("Yes"); else puts("No"); } return 0; }