首页 > 代码库 > HDU 4714 Tree2cycle(树型DP)
HDU 4714 Tree2cycle(树型DP)
解题思路:
将一棵树变成一个环。假设一个结点的分叉数目大于等于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)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。