Tree2cycle hdu4714 贪心

来源:互联网 发布:推荐算法 gbdt 编辑:程序博客网 时间:2024/06/11 05:40

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 + 1struct 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;}
1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 网贷逾期被仲裁怎么办 word所选内容无效怎么办 wps批注不显示了怎么办 船舶挂靠船务公司去要怎么办 被螃蟹扎了肿了怎么办 手指被海鲜刺了怎么办 被海鲜刺进去了怎么办 手被海鲜扎了怎么办 环评设备写错了怎么办 物业对高空抛物怎么办 如果法官不公平判案我该怎么办? 民事案夸省审理案件不公平怎么办 积目头像未通过审核怎么办 电压不稳空调带不动怎么办 孩子吃了塑料珠怎么办 美的电压力锅打不开盖子怎么办 瓶盖打不开怎么办 瓶子是玻璃的 杯子口关错位了怎么办 大玻璃瓶的玻璃瓶盖拧不开怎么办 按压式洗发水瓶盖打不开怎么办 向下按压的瓶盖打不开怎么办 玻璃罐头开过了打不开怎么办 玻璃瓶的塑料盖子打不开怎么办 泡酒玻璃瓶盖子打不开怎么办 罐头的塑料瓶盖打不开怎么办 塑料水杯盖紧了怎么办 拧不开矿泉水瓶盖怎么办 新暖壶盖吸住了怎么办 暖瓶盖被吸住了怎么办 做面包和面粘手怎么办 面包面和稀了怎么办 鱼缸氧气泵声音大怎么办 中班安全遇到火灾怎么办反思 汤洒了怎么办活动反思 下水道被塑料盖堵了怎么办 卫生间地漏盖子掉到下水道怎么办 洗手池下水道翻盖打不开了怎么办 培乐多彩泥吃了怎么办 超轻橡皮泥干了怎么办 脑梗脾气大怎么办好啊 牙齿喝饮料烂了怎么办