树形 DP hdu4714 Tree2cycle

原创 2015年09月03日 16:02:44


好坑的题,如果不加栈就会re,加栈以后记得交c++

#pragma comment(linker, "/STACK:1024000000,1024000000")

树形dp

思路:

分析出构成环的最少步骤

其实就是找将分开一条一条线连接成环

从每个点开始分析

如果一个点它的度数是小于2那么这个点所连接的边就一定不会拆开

如果这个点的读书是大于或者等于2

此时如果这个点和它的父节点不断开,那么它的子节点就只能保存一个

反之如果它和父节点断开,那么子节点可以保存两个

这样分析一下断开父节点一定是最优的情况

所以我们根据每个节点的子节点个数来找最后的步骤数

node子节点个数为s

s>=2 断开父节点+1,断开s-2个子节点+(s-2)

将s-2个子节点连接+(s-2)

将断开的node点与父节点部分相连接+1

如果node为根节点那么就不需要断开父节点,和与父节点再次相连接

/********************************************
Author         :Crystal
Created Time   :
File Name      :
********************************************/
#pragma comment(linker, "/STACK:1024000000,1024000000")//阔栈 
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <climits>
#include <string>
#include <vector>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <sstream>
#include <cctype>
using namespace std;
typedef long long ll;
typedef pair<int ,int> pii;
#define MEM(a,b) memset(a,b,sizeof a)
#define CLR(a) memset(a,0,sizeof a);
const int inf = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
//#define LOCAL
#define maxn 2100000
int nxt[maxn],pnt[maxn],head[maxn];
int cnt;
int n;
int ans=0;
void addedge(int u,int v){
pnt[cnt]=v;
nxt[cnt]=head[u];
head[u]=cnt++;
}
int dfs(int u,int pre){
int s = 0;
for(int i=head[u];i!=-1; i = nxt[i]){
int v = pnt[i];
if(v != pre){
s+=dfs(v,u);
}
}
if(s >= 2){
if(u==1) ans += 2*(s-2);
else ans += 2*(s-2)+2;
return 0;
}
return 1;
}
int main()
{
#ifdef LOCAL
freopen("in.txt", "r", stdin);
// freopen("out.txt","w",stdout);
#endif
int t;
scanf("%d",&t);
while(t--){
for(int i=0;i<maxn;i++)head[i]=-1;
cnt = 1;
scanf("%d",&n);
ans = 0;
for(int i=0;i<n-1;i++){
int u,v;scanf("%d%d",&u,&v);
addedge(u,v);
addedge(v,u);
}
dfs(1,-1);
printf("%d\n",ans+1);
}
return 0;
}
















相关文章推荐

HDU 4714 Tree2cycle (构造,树形DP)

题意:一个树减去一条边,或者加上一条边的费用都是1,问把这棵树改成一个圆的最小费用。 一个树形dp,不会dp的菜鸟,,,,各种分类讨论。。。 #pragma comment(linker, "/ST...

HDU-4714 Tree2cycle(树型dp)

传送门:HDU-4714 题意:一棵树有n个节点,有2种操作:①删除1条边;②添加1条边。每次操作花费为1,要求用最小花费使得这棵树变成一个环:整个图有n条边,每个点的度为2且构成1个联通块 题解...

hdu4714 Tree2cycle

原题链接:     hdu 4714 Tree2cycle 题目大意:给一棵树节点数最多为1000000 ,把这棵树通过删边 和加边使这棵树变成一个环,其中删边和加边的的代价都为 1,输出最小代价。...

Tree2cycle hdu4714 贪心

Description给定一棵N个节点的树,去掉这棵树的一条边需要消耗值1,为这个图的两个点加上一条边也需要消耗值1。树的节点编号从1开始。在这个问题中,你需要使用最小的消耗值(加边和删边操作)将这棵...
  • jpwang8
  • jpwang8
  • 2017年04月22日 16:22
  • 161

【DP】hdu4714树形DP,用c++交别用g++交

题http://acm.hdu.edu.cn/showproblem.php?pid=4714题意: 给你一颗n个节点的树,你可以删除或者添加一些边,代价都是1。问:要把这棵树变成一个环,至少需要多...
  • cww97
  • cww97
  • 2016年08月13日 19:30
  • 283

【2017多校】HDU6035 Colorful Tree 【听说是树形DP】

官方题解:单独考虑每一种颜色,答案就是对于每种颜色至少经过一次这种的路径条数之和。反过来思考只需要求有多少条路径没有经过这种颜色即可。直接做可以采用虚树的思想(不用真正建出来),对每种颜色的点按照 d...

HDU 5293 Tree chain problem [树链剖分+线段树+树形DP]

给出N个点的树,M条树链,树链有权,问在取出的树链互不相交的情况下,权值和最大是多少。...

【HDU 6035 Colorful Tree】+ 树形 dp + 思维

Colorful TreeTime Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...

HDU6035-Colorful Tree 补集思想+树形DP

传送门 题意: 给一棵树,树上的每一个点都有一种颜色,设定每一条边的值为边上不同颜色点的个数,问树上所有边的总价值。 思路: 1、假设共有 all_color 种颜色,共有 all_edge...

HDU 4863 Centroid of a Tree (树形dp)

少见HDU的题解网上居然少的可怜,仅有的几篇解释的都不太清楚……         于是自己花了一个晚上的时间理解别人的代码,发现别人的代码虽然是对的,但是写的确实难以理解,所以我决定挑起这个重担,把这...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:树形 DP hdu4714 Tree2cycle
举报原因:
原因补充:

(最多只允许输入30个字)