暑期集訓補題系列Day--3樹/佇列/棧
阿新 • • 發佈:2018-12-10
Day–3樹/佇列/棧
A.Useful Decomposition Codeforces 981C 題意:給你一棵N個結點的樹,然後輸入N-1條邊。要求將該樹拆成若干條簡單路徑,並且這些路徑都經過一個公共節點。給出任意一個解決方案,如不存在輸出No 思路:鄰接表存圖建雙向邊,如果一個點的出度>2,那麼他就是那個共享的點,如果有兩個共享的點,一定為NO。
我們把出度為1的點,存到一個數組中。如果有共享點,直接輸出:共享點~這個陣列中所有的點即可。
如果沒有共享點,那麼就是一條鏈的情況,輸出兩個出度為1的點即可。
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100005;
int n, xx;
vector<int> G[MAXN], s;
int main()
{
scanf("%d", &n);
for (int i = 0; i < n-1; i++)
{
int u, v; scanf("%d%d", &u, &v);
G[u].push_back(v);
G[v].push_back(u);
}
vector<int> x;
int cnt = 0, s = 0;
for (int i = 1; i <= n; i++)
{
if (G[i].size() == 1) x.push_back(i);
if (G[i].size() > 2) s = i, cnt++;
}
if (cnt >= 2) printf("No\n");
else
{
printf("Yes\n");
if (s == 0)//沒有分叉點即一條鏈的情況
{
printf("%d\n", 1);
printf ("%d %d\n", x[0], x[1]);
}
else
{
printf("%d\n", x.size());
for (auto i: x) printf("%d %d\n", s, i);
}
}
return 0;
}