HDU 4714 Tree2cycle(樹型DP)
阿新 • • 發佈:2017-05-31
queue long 樹型dp clear sin def namespace vector push_back
解題思路:
將一棵樹變成一個環。假設一個結點的分叉數目大於等於2。則將它與父節點斷開。而且斷開子結點數目sum - 2條邊,並再次連接sum-2個兒子形成一條直鏈然後這條遊離鏈與還有一條遊離鏈相連,共須要2*(sum-1)個操作,假設該結點為根結點,則一共須要2 * (sum - 2)種操作。
#include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <vector> #include <queue> #include <stack> #pragma comment(linker,"/STACK:102400000,102400000") #define LL long long using namespace std; const int MAXN = 1000000 + 10; int ans; vector<int>G[MAXN]; int n; int dfs(int u, int pre) { int sz = G[u].size(); int sum = 0; for(int i=0;i<sz;i++) { int v = G[u][i]; if(v == pre) continue; sum += dfs(v, u); } if(sum >= 2) { if(u == 1) ans += 2 * (sum - 2); else ans += 2 * (sum - 1); return 0; } return 1; } int main() { int T; scanf("%d", &T); while(T--) { scanf("%d", &n); for(int i=0;i<=n;i++) G[i].clear(); ans = 0; int u, v; for(int i=1;i<n;i++) { scanf("%d%d", &u, &v); G[u].push_back(v); G[v].push_back(u); } dfs(1, -1); printf("%d\n", ans + 1); } return 0; }
HDU 4714 Tree2cycle(樹型DP)