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
















hdu4714 Tree2cycle(树形dp)

hdu4714题目给你一棵树,删去或者添加一条边花费的代价都是1,问最小的花费是多少使得经过删边加边后树变成一个环。思路还是云里雾里的,只知道最终每个节点的度数是2,那么当它的分支大于等于2的时候一定...
  • pibaixinghei
  • pibaixinghei
  • 2016年08月24日 15:38
  • 216

hdu4714 Tree2cycle 树形DP

题目是问把一棵树通过剪边、加边形成一个环的最小代价。 分成两步,先把树剪成一些链,再把链连接成一个环。 My Code: //dp[u][0]表示u节点是所在链的端点时,以u节点为根节点的子树形...
  • Hhaile
  • Hhaile
  • 2013年09月10日 23:09
  • 635

hdu4714 Tree2cycle

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

hdu4714 Tree2cycle

下午心血来潮找来cjx第一次两人训练一套难度很低题目,就差这道思路正确不敢写,现在补一下。 题意:给你一棵树,每次删除一条边和增加一条边费用都是1,问最少的花费把一棵树变成 一条环。 思路:随...
  • yexiaohhjk
  • yexiaohhjk
  • 2017年04月30日 21:51
  • 487

hdu4714(树形dp)

链接:点击打开链接 题意:给出一棵树,删除一条边或者加入一条边的代价都是1,蚊最后使n个节点连成环所需的最小代价 代码:#pragma comment(linker,"/STACK:102400000...
  • stay_accept
  • stay_accept
  • 2016年06月13日 14:40
  • 326

hdu4714 树形dp

Tree2cycle Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others) ...
  • yuanjunlai141
  • yuanjunlai141
  • 2016年09月19日 21:22
  • 155

hdu4714之树形DP

Tree2cycle Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others) To...
  • xingyeyongheng
  • xingyeyongheng
  • 2013年09月27日 21:24
  • 1008

Tree2cycle hdu4714 贪心

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

hdu4714 Tree2cycle 树上乱搞

给一棵树,每次操作可以删一条边或者加一条边,
  • yanglei040
  • yanglei040
  • 2014年09月02日 16:36
  • 436

树形 DP 总结

一、介绍 1、什么是树型动态规划  顾名思义,树型动态规划就是在“树”的数据结构上的动态规划,平时作的动态规划都是线性的或者是建立在图上的,线性的动态规划有二种方向既向前和向后,相应的线性的动态规划有...
  • AngOn823
  • AngOn823
  • 2016年08月27日 14:12
  • 1610
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:树形 DP hdu4714 Tree2cycle
举报原因:
原因补充:

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