1. 程式人生 > >暑期集訓補題系列Day--3樹/佇列/棧

暑期集訓補題系列Day--3樹/佇列/棧

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; }