【佛山市选2013】JZOJ2020年8月7日提高组T2 树环转换
【佛山市选2013】JZOJ2020年8月7日提高组T2 树环转换
题目
描述
给定一棵N个节点的树,去掉这棵树的一条边需要消耗值1,为这个图的两个点加上一条边也需要消耗值1。树的节点编号从1开始。在这个问题中,你需要使用最小的消耗值(加边和删边操作)将这棵树转化为环,不允许有重边。
环的定义如下:
- 该图有N个点,N条边。
- 每个顶点的度数为2。
- 任意两点是可达的。
树的定义如下:
- 该图有N个点,N-1条边。
- 任意两点是可达的。
数据
对于20%的数据,有1≤N≤10。
对于100%的数据,有1≤N≤1000000。
题解
题意
给出一棵树
每次删边加边的代价都为一
问最小代价将树转成环
分析
看到树呢,很容易 (个屁) 想到树形DP
但是如果直接设状态的话不好转移
思考:环是什么
不就是一条链再加上一条边吗
一条链是什么
特殊的树呀!
那么就可以设\(f[i]\)表示以\(i\)为根的子树转成链的最小代价
如果想去推方程的话,先别急
我们来看一下什么是链

一张丑陋的图
很容易发现
除了第一个和最后一个点
其他节点的度数都为2
那么是不是可以设\(f[i][0]\)表示根节点\(i\)转换成链之后是两个端点中的一个的最小代价,\(f[i][1]\)表示不管\(i\)的位置的最小代价
放方程:
告知:\(S\)表示\(\sum_\ f[son][1]\),\(c\)表示儿子的个数,\(u,v\)是\(i\)的儿子
\(f[i][0]=min\begin{cases}S+2c\\S-(f[u][1]-f[u][0])+2*(c-1)\end{cases}\)
\(f[i][1]=min\begin{cases}f[i][0]\\S-(f[u][1]-f[u][0]+2*(c-2)\end{cases}\)
小小的优化:
对于\(u,v\)的话,既然要使更小,那么\(f[u][1]-f[u][0]\)之类的就要最大
记一下最大和次大就可以了
至于解释的话


另外就是
本题卡系统栈!!!
所以你可以打\(BFS\)或者开人工栈
Code
#include<cstdio>
#include<iostream>
#define inf 99999999
using namespace std;
struct node
{
int to,next,head;
}a[2000005];
int n,i,x,y,tot,f[1000005][3],d[1000005],father[1000005];
bool b[1000005];
void add(int x,int y)
{
tot++;
a[tot].to=y;
a[tot].next=a[x].head;
a[x].head=tot;
}
void bfs(int now)
{
int i,j,h,t,x,mx1,mx2,s,num;
h=0;
t=1;
d[1]=now;
b[now]=true;
while (h<t)
{
h++;
for (i=a[d[h]].head;i;i=a[i].next)
{
x=a[i].to;
if (b[x]==false)
{
t++;
d[t]=x;
b[x]=true;
}
else father[d[h]]=x;
}
}
for (j=t;j;j--)
{
mx1=mx2=-inf;
num=s=0;
for (i=a[d[j]].head;i;i=a[i].next)
{
x=a[i].to;
if (x!=father[d[j]])
{
num++;
s+=f[x][1];
if (f[x][1]-f[x][0]>mx1)
{
mx2=mx1;
mx1=f[x][1]-f[x][0];
}
else
{
if (f[x][1]-f[x][0]>mx2) mx2=f[x][1]-f[x][0];
}
}
}
f[d[j]][0]=min(s+2*num,s-mx1+2*(num-1));
f[d[j]][1]=min(f[d[j]][0],s-mx1-mx2+2*(num-2));
}
}
int main()
{
freopen("T2.in","r",stdin);
freopen("T2.out","w",stdout);
scanf("%d",&n);
for (i=1;i<n;i++)
{
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
bfs(1);
printf("%d\n",min(f[1][0],f[1][1])+1);
fclose(stdin);
fclose(stdout);
return 0;
}
【佛山市选2013】JZOJ2020年8月7日提高组T2 树环转换的更多相关文章
- 【五校联考1day2】JZOJ2020年8月12日提高组T2 我想大声告诉你
[五校联考1day2]JZOJ2020年8月12日提高组T2 我想大声告诉你 题目 Description 因为小Y 是知名的白富美,所以自然也有很多的追求者,这一天这些追求者打算进行一次游戏来踢出一 ...
- JZOJ2020年8月11日提高组T2 宝石
JZOJ2020年8月11日提高组T2 宝石 题目 Description 见上帝动了恻隐之心,天后也想显示一下慈悲之怀,随即从口袋中取出一块魔术方巾,让身边的美神维纳斯拿到后堂的屏风上去试试,屏风是 ...
- 【GDKOI2014】JZOJ2020年8月13日提高组T2 石油储备计划
[GDKOI2014]JZOJ2020年8月13日提高组T2 石油储备计划 题目 Description Input Output 对于每组数据,输出一个整数,表示达到"平衡"状态 ...
- 【NOIP2015模拟11.4】JZOJ2020年8月6日提高组T2 最优交换
[NOIP2015模拟11.4]JZOJ2020年8月6日提高组T2 最优交换 题目 题解 题意 有一个长度为\(n\)的正整数 最多可以进行\(k\)次操作 每次操作交换相邻两个位置上的数 问可以得 ...
- 【佛山市选2013】JZOJ2020年8月7日提高组T3 海明距离
[佛山市选2013]JZOJ2020年8月7日提高组T3 海明距离 题目 描述 对于二进制串a,b,他们之间的海明距离是指两个串异或之后串中1的个数.异或的规则为: 0 XOR 0 = 0 1 XOR ...
- 【佛山市选2013】JZOJ2020年8月7日提高组T1 回文子序列
[佛山市选2013]JZOJ2020年8月7日提高组T1 回文子序列 题目 描述 回文序列是指左右对称的序列.例如1 2 3 2 1是回文序列,但是1 2 3 2 2就不是.我们会给定一个N×M的矩阵 ...
- 【GDOI2007】JZOJ2020年8月10日提高组T1 夏娜的菠萝包
[GDOI2007]JZOJ2020年8月10日提高组T1 夏娜的菠萝包 题目 Description 夏娜很喜欢吃菠萝包,她的经纪人RC每半个月就要为她安排接下来的菠萝包计划.今天是7月份,RC又要 ...
- JZOJ2020年8月11日提高组T4 景点中心
JZOJ2020年8月11日提高组T4 景点中心 题目 Description 话说宁波市的中小学生在镇海中学参加计算机程序设计比赛,比赛之余,他们在镇海中学的各个景点参观.镇海中学共有n个景点,每个 ...
- JZOJ2020年8月11日提高组T3 页
JZOJ2020年8月11日提高组T3 页 题目 Description 战神阿瑞斯听说2008年在中华大地上,将举行一届规模盛大的奥林匹克运动会,心中顿觉异常兴奋,他想让天马在广阔的天空上,举行一场 ...
随机推荐
- Charles使用part4——修改网络请求
Charles提供了Map功能.Rewrite功能.Breakpoints功能,都可以达到修改服务器返回内容的目的,这三者的差异是: Map功能适合长期的将某些请求重定向到另一个网络地址或本地文件 ...
- c100k
sysctl -w fs.file-max=10485760 #系统允许的文件描述符数量10msysctl -w net.ipv4.tcp_rmem=1024 #每个tcp连接的读取缓冲区1k,一个连 ...
- (六)HTTP和HTTPS(转)
一.HTTP和HTTPS的基本概念 HTTP:用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少. HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的 ...
- Fira Code字体安装与配置
俗话说,工欲善其事,必先利其器.算法固然重要,但真正实践也很重要. 一个字体的好看程度,直接决定了写代码和看代码的心情.比如这样: 代码1: #include <iostream> #in ...
- 【Luogu】P2292 [HNOI2004]L语言 题解
前置芝士:\(Trie\)字典树 这道题,说是AC自动机,实际上一个\(Trie+\)队列轻松搞定. 首先,我们对所有单词建一棵\(Trie\). 然后,定义一个空队列\(Q\),初始时把\(-1\) ...
- 11张图和源码带你解析Spring Bean的生命周期,建议收藏~!
在网上已经有跟多Bean的生命周期的博客,但是很多都是基于比较老的版本了,最近把整个流程画成了一个流程图.待会儿使用流程图,说明以及代码的形式来说明整个声明周期的流程.注意因为代码比较多,这里的流程图 ...
- Servlet学习笔记(三)
目录 Servlet学习笔记(三) 一.HTTP协议 1.请求:客户端发送欸服务器端的数据 2.响应:服务器端发送给客户端的数据 3.响应状态码 二.Response对象 1.Response设置响应 ...
- SQL SERVER数据库常用命令
创建数据库: 命令:create database 数据库名: 示例:create database student: 删除数据库: 命令:drop database 数据库名: 示例:drop da ...
- linux + MongoDB 安装 + 部署 + 讲解 (满满干货看完记得收藏噢)
话不多说开始了! 安装 安装就依据菜鸟教程的进行安装 传送门 => https://www.runoob.com/mongodb/mongodb-linux-install.html 好啦!现在 ...
- yum安装报睡眠错误的解决方法
可能是系统自动升级正在运行,yum在锁定状态中.可以通过强制关掉yum进程:#rm -f /var/run/yum.pid然后就可以使用yum了.