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



相关文章推荐

HDU-4714 Tree2cycle(树型dp)

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

树形 DP hdu4714 Tree2cycle

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

HDU 4714 Tree2cycle (构造,树形DP)

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

Tree2cycle hdu4714 贪心

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

HDU 4714

题的意思是说他本来给你一棵树然后你删掉或者加上一条边的花费都是1.问你最小花费数让它变成一个环。...

HDU 4714 树的切割拼装成环

树的切割拼装成环题意: 有一棵树,现在想把它组装成环,问最少的步数是多少? 思路: 如果想成为环,那么首先思考当一个节点的直接连接的儿子数量大于1的时候就要把它儿子分开了,比如 1...

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

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

【HDU5721 BestCoder 2nd AnniversaryD】【平面最近点对 分治写法+KD-tree写法】Palace 平面最近点对

Palace Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total S...

HDU 4827 Cycle Cocycle 01高斯消元 bitset加速 模板

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4827题意有一个n个点m条边的图,你要给每个点一个0或1的标号,使得每个点与偶数个相同标号的点之间有边。如...
  • dpppBR
  • dpppBR
  • 2017年07月20日 21:01
  • 232

HDU 5782 Cycle

Problem Description Alice get two strings and the lengths are both N. Bored Alice wanna know whethe...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu4714 Tree2cycle
举报原因:
原因补充:

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