Tree2cycle hdu4714 贪心

标签: c++ hdu 贪心
259人阅读 评论(0) 收藏 举报
分类:

Description


给定一棵N个节点的树,去掉这棵树的一条边需要消耗值1,为这个图的两个点加上一条边也需要消耗值1。树的节点编号从1开始。在这个问题中,你需要使用最小的消耗值(加边和删边操作)将这棵树转化为环,不允许有重边。
环的定义如下:
(1)该图有N个点,N条边。
(2)每个顶点的度数为2。
(3)任意两点是可达的。
树的定义如下:
(1)该图有N个点,N-1条边。
(2)任意两点是可达的。

Solution


想到了树链剖分的模型

一棵树是可以分成很多条链的,而这些链又能连成环。那么我们只需要考虑如何去边使得链的数量最少就行了

记节点i的儿子数量为son,那么需要切掉son-2+1条边,记最后剩下tot条链,答案为tot*2+1
良心题库支持扩栈

Code


#pragma comment(linker, "/STACK:102400000,102400000")
#include <stdio.h>
#define rep(i, st, ed) for (int i = st; i <= ed; i += 1)
#define erg(i, st) for (int i = ls[st]; i; i = e[i].next)
#define N 1000001
#define E N * 2 + 1
struct edge{int x, y, next;}e[E];
inline int read(){
    char ch = getchar(); int x = 0;
    while (ch < '0' || ch > '9'){
        ch = getchar();
    }
    while (ch <= '9' && ch >= '0'){
        x = (x << 1) + (x << 3) + ch - '0';
        ch = getchar();
    }
    return x;
}
int ind[N], ls[N];
inline void addEdge(int &cnt, int x, int y){
    cnt += 1; e[cnt] = (edge){x, y, ls[x]}; ls[x] = cnt; ind[y] += 1;
    cnt += 1; e[cnt] = (edge){y, x, ls[y]}; ls[y] = cnt; ind[x] += 1;
}
int vis[N], ans;
inline int dfs(int now, int fa){
    vis[now] = 1;
    int cnt = 0;
    erg(i, now){
        if (!vis[e[i].y]){
            cnt += dfs(e[i].y, now);
        }
    }
    if (cnt >= 2){
        ans += cnt - 1;
    }
    return cnt < 2;
}
int main(void){
    int n = read();
    int edgeCnt = 0;
    rep(i, 2, n){
        int x = read(), y = read();
        addEdge(edgeCnt, x, y);
    }
    ans = 0;
    int root;
    rep(i, 1, n){
        if (ind[i] == 1){
            root = i;
            break;
        }
    }
    dfs(root, 0);
    printf("%d\n", ans * 2 + 1);
    // printf("%d\n", n * 2 - dis[ans] * 2 + 1);
    return 0;
}
查看评论

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

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

hdu4714(树形dp)

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

HDU-4714-树形dp

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

hdu 4714 (树形dp)

题意:给一棵树,删除一条边和增加一条边代价都是1,问把所有节点连成环,最少的代价。 思路:可以将树删成ans+1条链,答案就是ans+ans+1。如果一个节点的分支数大于1的话,就把该点与父节点的边...
  • aixiaoling1314
  • aixiaoling1314
  • 2013-10-09 17:34:34
  • 824

Tree2cycle hdu4714 贪心

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

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

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

hdu4714 Tree2cycle

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

hdu 4714(树形dp)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4714 思路:其实就是求树的分支数,然后就是分支数*2+1(要删边,加边变成直线最后在成环)。 ...
  • zjsyhjh
  • zjsyhjh
  • 2014-05-26 18:06:15
  • 324

hdu 4714 Tree2cycle

乱搞题,要求用最少的操作把一颗树转化成一个环。其实就是把树分成最少的链,然后连接起来即可,仔细观察树的话会发现,一般一个点的度如果大于1的话,该点必然要断开一些连接,因为最终每个点的度都是2, 然后就...
  • u010697167
  • u010697167
  • 2013-09-09 11:17:46
  • 1316

hdu4714 Tree2cycle

原题链接:     hdu 4714 Tree2cycle 题目大意:给一棵树节点数最多为1000000 ,把这棵树通过删边 和加边使这棵树变成一个环,其中删边和加边的的代价都为 1,输出最小代价。...
  • zhanghan735
  • zhanghan735
  • 2013-09-09 19:08:52
  • 365
    个人资料
    持之以恒
    等级:
    访问量: 12万+
    积分: 8079
    排名: 3213
    乱七八糟
    文章分类
    最新评论