用树形dp做的,dp[t][i]表示t及其孩子入度都已经小于等于2并且t这个节点的入度等于i的最优解。

那么转移什么的自己想想就能明白了。

关键在于这个题目会暴栈,所以我用了一次bfs搜索出节点的顺序,然后再计算。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=1e6+9;
struct
{
int to,next;
}e[maxn*2];
int head[maxn],lon;
bool text[maxn];
void edgeini()
{
memset(head,-1,sizeof(head));
lon=-1;
}
void edgemake(int from,int to)
{
e[++lon].to=to;
e[lon].next=head[from];
head[from]=lon;
}
int dp[maxn][3];
int from[maxn];
void dfs(int t)
{
int k;
int a1=10,a2=10,ret=0,u;
for(k=head[t];k!=-1;k=e[k].next)
{
u=e[k].to;
if(u==from[t]) continue;
ret++;
dp[t][0]+=dp[u][2]+2;
if(dp[u][1]-dp[u][2]<a1)
{
a2=a1;
a1=dp[u][1]-dp[u][2];
}
else if(dp[u][1]-dp[u][2]<a2)
a2=dp[u][1]-dp[u][2];
}
if(ret>=1)
dp[t][1]=max(0,dp[t][0]+a1-2);
else
dp[t][1]=dp[t][0];
if(ret>=2)
dp[t][2]=max(0,dp[t][0]+a1+a2-4);
else
dp[t][2]=dp[t][1];
// cout<<0<<endl;
} int que[maxn];
void bfs()
{
int front=1,end=0;
que[++end]=1;
text[1]=1;
while(front<=end)
{
int t=que[front++];
for(int k=head[t];k!=-1;k=e[k].next)
{
int u=e[k].to;
if(!text[u])
{
from[u]=t;
text[u]=1;
que[++end]=u;
}
}
}
for(int i=end;i>=1;i--)
dfs(que[i]);
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(dp,0,sizeof(dp));
edgeini();
int n;
scanf("%d",&n);
for(int i=1,from,to;i<n;i++)
{
scanf("%d %d",&from,&to);
edgemake(from,to);
edgemake(to,from);
}
memset(text,0,sizeof(text));
bfs();
printf("%d\n",dp[1][2]+1);
}
return 0;
}

hdu 4714 Tree2cycle dp的更多相关文章

  1. HDU 4714 Tree2cycle DP 2013杭电热身赛 1009

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4714 Tree2cycle Time Limit: 15000/8000 MS (Java/Other ...

  2. HDU 4714 Tree2cycle (树形DP)

    Tree2cycle Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others)Tot ...

  3. HDU 4714 Tree2cycle (树形DP)

    题意:给定一棵树,断开一条边或者接上一条边都要花费 1,问你花费最少把这棵树就成一个环. 析:树形DP,想一想,要想把一棵树变成一个环,那么就要把一些枝枝叶叶都换掉,对于一个分叉是大于等于2的我们一定 ...

  4. HDU 4714 Tree2cycle(树状DP)(2013 ACM/ICPC Asia Regional Online ―― Warmup)

    Description A tree with N nodes and N-1 edges is given. To connect or disconnect one edge, we need 1 ...

  5. HDU 4714 Tree2cycle(树型DP)

    解题思路: 将一棵树变成一个环.假设一个结点的分叉数目大于等于2.则将它与父节点断开.而且断开子结点数目sum - 2条边,并再次连接sum-2个儿子形成一条直链然后这条游离链与还有一条游离链相连,共 ...

  6. HDU 4714 Tree2cycle

    Tree2cycle dfs 不是根节点:如果边数大于等于2,则删除与父节点的边.并且是一条环,那么每个点的度数是2,则还要删除num(每个节点儿子数)-2,只留两个儿子.当然删除边的儿子也要连到环上 ...

  7. HDU 4714 Tree2cycle:贪心

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4714 题意: 给你一棵树,添加和删除一条边的代价都是1.问你将这棵树变成一个环的最小代价. 题解: 贪 ...

  8. hdu 4714 树形DP

    思路:dp[i][0]表示第i个节点为根的子树变成以i为一头的长链最小的花费,dp[i][0]表示表示第i个节点为根的子树变成i不是头的长链最小花费. 那么动态方程也就不难想了,就是要分几个情况处理, ...

  9. hdu 4714 Tree2cycle 树形经典问题

    发现今天没怎么做题,于是随便写了今天杭电热身赛的一题. 题目:给出一棵树,删边和添边的费用都是1,问如何删掉一些树边添加一些树边,使得树变成一个环. 分析:统计树的分支数.大概有两种做法: 1.直接d ...

随机推荐

  1. SilkTest天龙八部系列6-用open agent进行测试

    SilkTest支持两种测试模式,一种是用classic agent,另一种就是用我们今天要介绍的open agent. open agent可以提供和classic agent差不多的录制回放功能. ...

  2. 二维码的妙用:通过Zxing实现wifi账号password分享功能

    二维码是搭载信息的一种载体,通过二维码能够传递名片.网址.商品信息等,本文讲到二维码的第二种妙用:通过二维码实现wifi账号和password分享. 关于二维码的基础知识,请訪问:二维码的生成细节和原 ...

  3. 2^x mod n = 1 【杭电-HDOJ-1395】 附题

    /* 2^x mod n = 1 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  4. Fragment使用

    当我们需要动态的多界面切换的时候,就需要将UI元素和Activity融合成一个模块.在2.3中我们一般通过各种Activity中进行跳转来实现多界面的跳转和单个界面动态改变.在4.0或以上系统中就可以 ...

  5. ExecuteReader: CommandText 属性尚未初始化

    没有对sqlcommand对象的commandtext属性赋值说白了就是没写SQL语句 -.- 无语死了.

  6. 纠错记录(Could not open the editor: Android XML Editor cannot process this input.)

    Eclipse无法打开xml文件 preference->general->edit->file association->file types->选择.xml,然后在a ...

  7. HDU4544 湫湫系列故事――消灭兔子

    HDU 4544 Tags: 数据结构,贪心 Analysis: 将兔子的血量从大到小排序,将箭的杀伤力从大到小排序,对于每一个兔子血量, 将比他大的杀伤力大的剑压入优先队列,优先队列自己重写,让它每 ...

  8. sql server 实现sleep延时

    sql server中实现与C++ 中Sleep类似的功能,可以使用 waitfor delay '00:00:00:10' 表示延时10毫秒

  9. SQL 教程

    SQL 教程 http://www.w3school.com.cn/sql/

  10. _splitpath / _wsplitpath 将绝对路径分割为盘符、路径、文件名、扩展名。

    今天分享下一个路径分割的API,可以将一个完整的绝对路径分割为: 盘符(包括冒号:) 路径(包含前面&后面的\,不含盘符&文件名) 文件名(不含扩展名) 扩展名(包含前面的.) 先不说 ...