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…

简单ajax库

1 function TuziAjax(reqType,url,fnoK, fnFail)2 {3 var xmlHttp null;4 if (window.XMLHttpRequest) { 5 xmlHttp new XMLHttpRequest();6 }7 else { 8 xmlHttp new ActiveXObject("Microsoft.XMLHTTP");//兼容IE69 } 10 …

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

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

Java String和Date的转换 Date类型操作

String—>Date String dateString "2012-12-06 "; try {SimpleDateFormat sdf new SimpleDateFormat("yyyy-MM-dd ");Date date sdf.parse(dateString); } catch (ParseException e) {System.out.println(e.getMessage()); } /*** 字符串转换到时间格…

一文了解数组

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。有关完整的…

React工作(1)---export导出

import React, { Component } from react;class List extends Component {constructor(props) {super(props);}render() {return <div>1111</div>;} }export default List;

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

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

动态SQL中变量赋值

在动态SQL语句中进行变量的值绑定比较麻烦&#xff0c;这儿做个记录 declare COUNT int,sql nvarchar(max) set sql select COUNT count(id) from tbl_sys_dict where root_key WT_TYPE execute sp_executesql sql, NCOUNT int output, COUNT output print COUNT 转载于:htt…

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

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

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

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

后台命名查询sql查某几个字段传到前台

dwr调用查出数据库字段 传给前台显示 前台只能接受list 后台数据放进list传入前台 name-quary中 <!-- 定义sql 通过单位id 查单位名称 --> <sql-query name"getStationName"> <![CDATA[ select STATION_ID,STATION_NAME from MF_STATION wher…

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

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

hadoop遇到的问题及处理

1:杀掉hadoop作业 列出作业 ./hadoop job -list杀掉 ./hadoop job -kill job_id1&#xff1a;某些节点出现running asprocess XXX. Stop it first 这是由于各节点登录用户为root&#xff0c;在启动hadoop前&#xff0c;务必将各节点用户切换至普通用户hadoop下&#xff0c;切换…

Mac 下安装配置 Python 开发环境

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