2 条题解
-
0
仔细想想,一颗真正有分叉的树怎么可能一笔画,所以只能是退化成一条链的树
#include<bits/stdc++.h> using namespace std; int main(){ int n; cin >> n; vector<int> d(n + 5); for(int i = 1; i < n; i ++){ int u, v; cin >> u >> v; d[u] ++, d[v] ++; } if(n == 2) cout << "1 2" << endl; else{ vector<int> res; for(int i = 1; i <= n; i ++) if(d[i] == 1) res.push_back(i); else if(d[i] != 2){ cout << -1 << endl; return 0; } cout << res[0] << ' ' << res[1] << endl; } } -
0
图论
简单路径不能经过一个点两次,因此如果一个点有 3 条或者更多条边,就一定会有走不到的边。
因此这棵树一定会是一条链,那么我们只需要找到链的两个端点即可。
如果你知道点的度数的话应该很容易想到:链端点(即树的叶子节点)的度数是为 1 的,非端点(非叶子节点)的度数为 2 。
因此我们只要计算每个点的度数,答案就是度数为 1 的两个点(并且度数为 1 的点有且只有两个)。
时间复杂度 。
#include<bits/stdc++.h> using namespace std; int main(){ int n; cin >> n; vector<int> in(n + 1); for(int i = 1; i < n; i++){ int u, v; cin >> u >> v; in[u]++; in[v]++; } vector<int> ans; for(int i = 1; i <= n; i++){ if(in[i] == 1) ans.push_back(i); if(in[i] > 2){ cout << -1 << endl; return 0; } } for(auto &i : ans){ cout << i << " "; } cout << endl; }
- 1
信息
- ID
- 158
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 37
- 已通过
- 16
- 上传者