HDU 4714 Tree2cycle (构造,树形DP)

原创 2013年09月08日 17:09:10

题意:一个树减去一条边,或者加上一条边的费用都是1,问把这棵树改成一个圆的最小费用。

一个树形dp,不会dp的菜鸟,,,,各种分类讨论。。。


#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <list>
#include <deque>
#include <string>

#define LL long long
#define DB double
#define SI(a) scanf("%d",&a)
#define SD(a) scanf("%lf",&a)
#define SS(a) scanf("%s",a)
#define SF scanf
#define PF printf
#define MM(a,b) memset(a,b,sizeof(a))
#define REP(i,a,b) for(int (i)=(a);(i)<(b);(i)++)
#define REPD(i,a,b) for(int (i)=(a);(i)>(b);(i)--)
#define N 1000009
#define INF 0x3f3f3f3f
#define EPS 1e-8
#define bug puts("bug")
using namespace std;
vector<int> L[N];
int n,ans;
int v[N];
int solve(int k)
{
    if(v[k]) return 0;
    v[k] = 1;
    int s =0;
    REP(i,0,(int)L[k].size())
    {
        int to = L[k][i];
        s += solve(to);
    }
    if(k==1)
    {
        if(s==0)
        {
            ans++;
            return 0;
        }
        if(s==1)
        {
            ans++;return 0;
        }
        if(s==2)
        {
            ans++;///ans+=2;不需要将该节点与父亲节点的边删掉,so,只需要加一次,谢谢qw4990指出错误。
            return 0;
        }
        if(s>2)
        {
            ans += (s-2)*2+1;
            return 0;
        }
    }else
    {
        if(s==0) return 1;
        if(s==1) return 1;
        if(s==2)
        {
            ans+=2;
            return 0;
        }
        if(s>2)
        {
            ans += (s-2)*2+2;
            return 0;
        }
    }
    return -1;
}
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
    #endif
    int cas;SI(cas);
    while(cas--)
    {
        SI(n);
        REPD(i,n+5,-1) L[i].clear();
        int a,b;
        MM(v,0);
        ans = 0;
        REP(i,1,n)
        {
            SI(a);SI(b);
            L[a].push_back(b);
            L[b].push_back(a);
        }
        solve(1);
        PF("%d\n",ans);
    }
    return 0;
}

HDU-4714-树形dp

题目大意:给定一棵树,每次删边或者增边代价为1,问把这棵树变成一个环最小代价是多少; 题目解析:删边肯定就要增边,所以答案的形式最后肯定是2*m+1,我们就需要求m的最小值;每次dfs的时候若果so...
  • zyz_3_14159
  • zyz_3_14159
  • 2016年12月15日 14:40
  • 131

HDU 4714 Tree2cycle(树形dp)

题目链接; HDU 4714 Tree2cycle 题意: 给一个nn个节点和n−1n-1条边的树。要求把这棵树变成一个环(所有的点都在环上),每破坏一条边和新建一条边的代价都是1,求最小的代...
  • Ramay7
  • Ramay7
  • 2016年08月15日 21:28
  • 208

hdu 4714 Tree2cycle (树形dp)

Tree2cycle Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others)...
  • u010228612
  • u010228612
  • 2013年09月10日 21:24
  • 1044

hdu 4714 Tree2cycle dp

用树形dp做的,dp[t][i]表示t及其孩子入度都已经小于等于2并且t这个节点的入度等于i的最优解。 那么转移什么的自己想想就能明白了。 关键在于这个题目会暴栈,所以我用了一次bfs搜索出节点的...
  • yrleep
  • yrleep
  • 2013年09月08日 21:48
  • 742

hdu3899(树形dp)

链接:点击打开链接 题意:给出一棵树每个点的权值和每条边的长度,点j到点i的代价为点j的权值乘以连接i和j的边的长度,输出点x,使得所有点到x点的代价最小 代码:#pragma comment(lin...
  • stay_accept
  • stay_accept
  • 2016年07月31日 17:08
  • 294

HDU 4714 Tree2cycle(树型DP)

解题思路: 将一棵树变成一个环,如果一个结点的分叉数目大于等于2,则将它与父节点断开,并且断开子结点数目sum - 2条边,并再次连接sum-2个儿子形成一条直链然后这条游离链与另一条游离链相连,共...
  • u013967323
  • u013967323
  • 2015年03月19日 09:36
  • 438

HDU 6201transaction 【树形DP】

2017 ACM/ICPC Asia Regional Shenyang Online transaction transaction transaction Time Limit: 4000/2...
  • m0_37953323
  • m0_37953323
  • 2017年09月10日 18:02
  • 275

hdu1520(树形dp入门)

Anniversary party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others...
  • martinue
  • martinue
  • 2016年03月14日 13:21
  • 270

HDU 6161 树形DP + 优化

树形DP + 优化题意:​ 有n个节点标号1~n,根据其公式建树,每个节点有权值最开始就是标号本身,有两种操作,分别是: 修改u节点的值为v 问经过u节点的路径中最大的权值和是多少 思路:​ ...
  • Since_natural_ran
  • Since_natural_ran
  • 2017年08月23日 20:28
  • 325

hdu 4714 (树形dp)

hdu 4714 (树形dp) 分类: DP2013-10-09 17:34 61人阅读 评论(0) 收藏 举报 ACM算法编程百度树形DP 题意:给一棵树,删除一条边和...
  • pi9nc
  • pi9nc
  • 2013年10月09日 20:24
  • 463
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDU 4714 Tree2cycle (构造,树形DP)
举报原因:
原因补充:

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