hdu4714 Tree2cycle

原创 2013年09月09日 19:08:52

原题链接:

    hdu 4714 Tree2cycle

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

题目分析:由于最终要形成一个环其拥有的的边一定为n,故可以只讨论要删除多少条边, 由于要形成环,删边后每个节点最多只能有两个节点,

 如果 当前节点有多于2个子节点与其相连,其与父亲节点连接的边要删除。


喳喳代码:

#pragma comment(linker, "/STACK:167772160")//手动扩栈~~~~hdu 用c++交
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define N 1100000
using namespace std;
vector<int> tree[N];
int n;
int num;
int dfs(int pos,int p)//如果当前节点与父亲节点的连线要删去返回1否则返回0
{
    int len=tree[pos].size();
    if(len==1&&tree[pos][0]==p)
        return 1;
    int k=0;//记录当前节点的所有子节点返回的没有删除的与子节点连边的个数
    int t;
    for(int i=0; i<len; i++)
    {
        t=tree[pos][i];
        if(t==p)continue;
        k+=dfs(t,pos);
    }
    if(k>=2)//如果k>=2表示应该删除与父节点相连的边
    {
        num+=k-2;
        if(pos!=1)
            num++;
        return 0;
    }
    return 1;
}
int main()
{
    //freopen("in.txt","r",stdin);
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(int i=1; i<=n; i++)
            tree[i].clear();
        int a,b;
        for(int i=0; i<n-1; i++)
        {
            scanf("%d%d",&a,&b);
            tree[a].push_back(b);
            tree[b].push_back(a);
        }
        num=0;//表示要删除的边数
        dfs(1,-1);
        int ans=2*num+1;
        printf("%d\n",ans);
    }
    return 0;
}



hdu4714 Tree2cycle 使一棵树变成环最小代价

Tree2cycle              思路:其实就是把一棵树变成许多链再连成环,求最小代价。一个结点如果有两个子结点,如果有父结点,删除与其中一个儿子的连边和删除与父节点的连边效果都一样。如...
  • lov_vol
  • lov_vol
  • 2016-04-21 15:21:39
  • 473

hdu4714 Tree2cycle

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

Tree2cycle hdu4714 贪心

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

hdu4714 Tree2cycle 树上乱搞

给一棵树,每次操作可以删一条边或者加一条边,
  • yanglei040
  • yanglei040
  • 2014-09-02 16:36:20
  • 450

hdu4714 Tree2cycle 树形DP

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

hdu4714 Tree2cycle(树形dp)

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

树形 DP hdu4714 Tree2cycle

好坑的题,如果不加栈就会re,加栈以后记得交c++ #pragma comment(linker, "/STACK:1024000000,1024000000") 树形dp 思路: 分析出...
  • meixiuxiudd
  • meixiuxiudd
  • 2015-09-03 16:02:44
  • 288

树形DP+贪心(乱搞)(HDU4714)

题意:给出一个树形图,要求把
  • u012859437
  • u012859437
  • 2014-11-10 17:24:12
  • 739

HDU 4714

HDU 4714 题意: 给出一棵树,设定切断一条边花费跟连接一条边的花费均为1,问将这棵树变为一个圆的最小花费。 钻牛角尖了,钻牛角尖了,一直去抓树的直径,这个时候就体现出队友的重要性了,给了...
  • rssj_chlh
  • rssj_chlh
  • 2013-09-08 18:49:21
  • 702

HDU 4714 树的切割拼装成环

树的切割拼装成环题意: 有一棵树,现在想把它组装成环,问最少的步数是多少? 思路: 如果想成为环,那么首先思考当一个节点的直接连接的儿子数量大于1的时候就要把它儿子分开了,比如 1...
  • Since_natural_ran
  • Since_natural_ran
  • 2017-08-06 23:30:03
  • 152
收藏助手
不良信息举报
您举报文章:hdu4714 Tree2cycle
举报原因:
原因补充:

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