hdu4714 Tree2cycle 把树剪成链

题目是问把一棵树通过剪边、加边形成一个环的最小代价。

分成两步,先把树剪成一些链,再把链连接成一个环。

设一棵有n个节点的树,剪掉X条边后,形成L条链。

那么代价为X+L。

n-1-X=edgeNum(L条链) ① //原本有n-1条边,剪掉X条,还剩edgeNum(L条链)条

edgeNum(L条链)+L=n ② //L条链的这些边+L条边形成一个有n条边的环

由①、②得到,L=X+1

则代价为 X+L=2*L-1=2*X+1。

问题转化成了,把一棵树剪成一些链,最少能剪成几条链?或者,最少需要剪掉多少条边?

我觉得到了这一步问题就好解决了,我是树形dp搞的,求的是最少能剪成几条链。

dp[u][0]表示u节点是所在链的端点时,以u节点为根节点的子树形成的最少的链数。

dp[u][1]表示u节点是所在链的中间的点时,以u节点为根节点的子树形成的最少的链数。

然后就可以转移了。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<vector>
 4 #pragma comment(linker, "/STACK:102400000,102400000")
 5 using namespace std;
 6 const int N = 1000005;
 7 const int inf = N;
 8 
 9 vector<int> G[N];
10 int dp[N][2];
11 
12 inline int min(int a,int b)    {return a<b?a:b;}
13 
14 void dfs(int u,int fa)
15 {
16     int sz = G[u].size();
17     int v,cld=0,sum=0,min1=inf,min2=inf,temp;
18     for(int i=0;i<sz;i++)
19     {
20         v = G[u][i];
21         if( v!=fa )
22         {
23             cld++;
24             dfs(v,u);
25             temp = min(dp[v][0],dp[v][1]);
26             sum += temp;
27             temp = dp[v][0] - temp;
28             if( temp<min1 )    {min2=min1;min1=temp;}
29             else if( temp<min2 )    min2=temp;
30         }
31     }
32     if( !cld )    dp[u][0]=1,dp[u][1]=inf;
33     else if( 1==cld )    dp[u][0]=sum+min1,dp[u][1]=inf;
34     else
35     {
36         dp[u][0] = sum + min1;
37         dp[u][1] = sum + min1 + min2 - 1;
38     }
39 }
40 
41 int main()
42 {
43     int T;
44     int n,u,v;
45 
46     //freopen("4714.in","r",stdin);
47     //freopen("myout.txt","w",stdout);
48     scanf("%d",&T);
49     while( T-- )
50     {
51         scanf("%d",&n);
52         for(int i=1;i<=n;i++)    G[i].clear();
53         for(int i=0;i<n-1;i++)
54         {
55             scanf("%d%d",&u,&v);
56             G[u].push_back(v);
57             G[v].push_back(u);
58         }
59         dfs(1,0);
60         printf("%d\n",2*min(dp[1][0],dp[1][1])-1);
61     }
62     return 0;
63 }
View Code

 

 

转载于:https://www.cnblogs.com/kiwi-bird/p/3310970.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/408493.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

github标星58500+:常见数据结构与算法的python实现

昨天分享的文章介绍了如何学习数据结构算法&#xff1a;今天介绍一个 github 仓库&#xff0c;用 Python 实现了常见的数据结构与算法。另外&#xff0c;前几天的红包抽奖&#xff0c;今晚就开奖了&#xff0c;还没参与的&#xff0c;赶紧点进来&#xff1a;有人问我数据结构与…

【吐血整理】那些让你起飞的计算机基础知识:学什么,怎么学?

作者&#xff1a;帅地来源公众号&#xff1a;苦逼的码农我公众号里的文章&#xff0c;写的大部分都是与计算机基础知识相关的&#xff0c;这些基础知识&#xff0c;就像我们的内功&#xff0c;如果在未来想要走的更远&#xff0c;这些内功是必须要修炼的。框架千变万化&#xf…

数据结构算法入门--一文了解什么是复杂度

图片来自 Pixabay&#xff0c;作者&#xff1a;TeroVesalainen2019 年第 74 篇文章&#xff0c;总第 98 篇文章本文大约 3000 字&#xff0c;阅读大约需要 10 分钟最近会开始更新一个数据结构算法的学习系列&#xff0c;同时不定期更新 leetcode 的刷题。这是第一篇文章&#x…

一文了解数组

2019 年第 75 篇文章&#xff0c;总第 99 篇文章”数据结构算法入门系列的第二篇&#xff0c;这次介绍下数组&#xff0c; 数组是一个最基础而且常见的数据结构&#xff0c;几乎每种编程语言都有。上一篇文章&#xff1a;数据结构算法入门--一文了解什么是复杂度今日推荐阅读…

Python3.8 了解的差不多了吧,Python3.9 新特性了解一下!

"Python学习开发"&#xff0c;一个值得加星标的公众号。正文共&#xff1a;4946 字 1 图预计阅读时间&#xff1a;13 分钟作者:陈祥安原文有删改:https://docs.python.org/3.9/whatsnew/3.9.html本文将解释 Python 3.9 中的新特性&#xff0c;而不是 3.8。有关完整的…

首发:适合初学者入门人工智能的路线及资料下载

本文为AI入门提供了一个简易的学习路线&#xff0c;并提供了代码和数据集下载。&#xff08;黄海广&#xff09;一、前言AI以及机器学习入门&#xff0c;初学者遇到的问题非常多&#xff0c;但最大的问题就是&#xff1a;资料太多&#xff01;&#xff01;&#xff01;看不完&a…

数据结构算法入门--链表

2019 年第 76 篇文章&#xff0c;总第 100 篇文章 本文大约 3200 字&#xff0c;阅读大约需要 10 分钟 数据结构算法系列&#xff1a; 数据结构算法入门系列第三篇--链表&#xff0c;链表也是非常常见的数据结构&#xff0c;面试过程中也会经常考到相关的题目。 本文首先介绍链…

react学习(3)----不能在该位置用setstate

this.setState({ pageIndex: 1, pageSize: 10, });

带你少走弯路:强烈推荐的Keras快速入门资料和翻译(可下载)

上次写了TensorFlow和PyTorch的快速入门资料&#xff0c;受到很多好评&#xff0c;读者强烈建议我再出一个keras的快速入门路线&#xff0c;经过翻译和搜索网上资源&#xff0c;我推荐4份入门资料&#xff0c;希望对大家有所帮助。备注&#xff1a;另外两个入门资料很负责任地说…

Mac 下安装配置 Python 开发环境

图片来源&#xff1a;Unsplash&#xff0c;作者 Markus Spiske 2019 年第 77 篇文章&#xff0c;总第 101 篇文章前言记录下 Mac 电脑的开发环境安装配置&#xff0c;主要包括&#xff1a;安装&使用Homebrew安装使用 git安装 anaconda&#xff0c;配置 python3 环境安装 ju…

react学习(5)----通过设置初始值控制页面render渲染

boothActivityCode: this.props.location.query.code || ,

【Android源代码下载】收集整理android界面UI效果源码

在Android开发中&#xff0c;Android界面UI效果设计一直都是很多童鞋关注的问题&#xff0c;今天给大家分享下大神收集整理的多个android界面UI效果&#xff0c;都是源码&#xff0c;都是干货&#xff0c;贡献给各位网友&#xff01; 话不多说&#xff0c;直接上效果图&#xf…

一文了解类别型特征的编码方法

来源&#xff1a;Unsplash&#xff0c;作者&#xff1a;an Rizzari2019 年第 78 篇文章&#xff0c;总第 102 篇文章目录&#xff1a;问题描述数据准备标签编码自定义二分类one-hot 编码总结问题描述一般特征可以分为两类特征&#xff0c;连续型和离散型特征&#xff0c;而离散…

如何用栈实现浏览器的前进和后退?

2019 年第 79 篇文章&#xff0c;总第 103 篇文章数据结构与算法系列的第四篇文章&#xff0c;前三篇文章&#xff1a;前言浏览器的前进和后退功能怎么用栈来实现呢&#xff1f;这里先介绍一下栈的定义和实现&#xff0c;并介绍它的一些常用的应用&#xff0c;最后再简单实现一…

数据科学家令人惊叹的排序技巧

2019 年第 80 篇文章&#xff0c;总第 104 篇文章本文大约 7800 字&#xff0c;阅读大约需要20分钟原题 | Surprising Sorting Tips for Data Scientists作者 | Jeff Hale原文 | https://towardsdatascience.com/surprising-sorting-tips-for-data-scientists-9c360776d7e译者 …

几个有趣的python技巧

2019 年第 82 篇文章&#xff0c;总第 106 篇文章标题 | python-is-cool作者 | chiphuyen原文 | https://github.com/chiphuyen/python-is-cool译者 | kbsc13("算法猿的成长"公众号作者)声明 | 翻译是出于交流学习的目的&#xff0c;欢迎转载&#xff0c;但请保留本文…