DTOJ #3316. baka
【题目描述】
给定一颗有方向的树,改变一条边方向的代价为 $1$,求使得从两个点出发能到达树上所有节点的最小代价。
【输入格式】
第一行一个正整数 $n$。
接下来 $n-1$ 行,每行两个正整数 $u,v$,表示 $u$ 向 $v$ 连一条有向边。
【输出格式】
一行一个数表示答案。
【样例】
样例输入
4
2 1
3 1
4 1
样例输出
1
【数据范围与提示】
对于 $100\%$ 的数据,$1\leq n\leq 10^6]$。
【题解】
本题有两种思路。
第一种,考虑到有两个起点,设 $f[i][1/2][0/1]$ 表示以 $i$ 为根的子树内已经有 $1/2$ 个出发点,$i$ 是否为出发点,直接转移即可。
第二种,考虑到两个起点必然将整棵树分成两部分,考虑断边,换根 $dp$ 即可。
【代码】
#include<bits/stdc++.h> const int maxn=1000000+10; const int inf=1000000000; int n,f[maxn][2][2],g[2][2]; std::vector<int> E[maxn],G[maxn]; inline int read ( void ) {int x=0;char ch;bool f=true;while ( !isdigit(ch=getchar()) ) if ( ch=='-' ) f=false;for ( x=ch^48;isdigit(ch=getchar()); ) x=(x<<1)+(x<<3)+(ch^48);return f ? x : -x ; } using std::min; inline void dfs ( int u,int fr ) {f[u][0][0]=f[u][1][0]=f[u][1][1]=inf;for ( int v:E[u] ) if ( v!=fr ){dfs(v,u);for ( int i=0;i<2;i++ ) for ( int j=0;j<2;j++ ) g[i][j]=f[u][i][j];f[u][0][0]=min(g[0][0]+f[v][0][1],g[0][1]+min(f[v][0][0],f[v][0][1])+1);f[u][0][1]=g[0][1]+f[v][0][1];f[u][1][0]=min(min(g[0][0]+min(min(f[v][0][0],f[v][1][1]),f[v][0][1]+1),g[0][1]+min(f[v][1][0],f[v][1][1])+1),min(g[1][0]+f[v][0][1],g[1][1]+min(f[v][0][0],f[v][0][1])+1));f[u][1][1]=min(g[1][1]+f[v][0][1],g[0][1]+min(f[v][1][1],f[v][0][0]));}for ( int v:G[u] ) if ( v!=fr ){dfs(v,u);for ( int i=0;i<2;i++ ) for ( int j=0;j<2;j++ ) g[i][j]=f[u][i][j];f[u][0][0]=min(g[0][0]+f[v][0][1]+1,g[0][1]+min(f[v][0][0],f[v][0][1]));f[u][0][1]=g[0][1]+f[v][0][1]+1;f[u][1][0]=min(min(g[0][0]+min(min(f[v][0][0],f[v][1][1]+1),f[v][0][1]+0),g[0][1]+min(f[v][1][0],f[v][1][1])+0),min(g[1][0]+f[v][0][1]+1,g[1][1]+min(f[v][0][0],f[v][0][1])));f[u][1][1]=min(g[1][1]+f[v][0][1],g[0][1]+min(f[v][1][1],f[v][0][0]))+1;} } signed main() {n=read();for ( int i=1,u,v;i<n;i++ ) u=read(),v=read(),E[u].push_back(v),G[v].push_back(u);dfs(1,0);return !printf("%d\n",min(min(f[1][0][0],f[1][0][1]),min(f[1][1][0],f[1][1][1]))); }
转载于:https://www.cnblogs.com/RenSheYu/p/11330275.html
DTOJ #3316. baka相关推荐
- #3316. baka
题目描述 Worldwide_D最近沉迷东方. 数学课上,Worldwide_D在研究对数,然后渐渐睡着了.他梦见自己躺在幻想乡的雾之湖边,听见旁边有两个妖精在对话,原来是Cirno和Daiyouse ...
- bzoj 3316: JC loves Mkk(二分+单调队列)
3316: JC loves Mkk Time Limit: 5 Sec Memory Limit: 64 MB Submit: 1047 Solved: 339 [Submit][Status] ...
- 【DTOJ】2701:问候
DTOJ 2701:问候 解题报告 2017.11.08 第一版 --由翱翔的逗比w原创,引用yzl_rex的CSDN博客 题目信息: 题目描述 问候人类! 输入 输入一行,一个名字,如human( ...
- DTOJ 1486:分数(score)
DTOJ 1486:分数(score) [题目描述] [输入] 第一行包含两个正整数N和P,表示选手的个数以及精度要求. 接下来的N行,每行包含一个0到100(闭区间)内的整数. [输出] 输出一个实 ...
- DTOJ 1552:网络小说分组(novel)
DTOJ 1552:网络小说分组(novel) [题目描述] YK酷爱阅读网络小说,读起来便是没日没夜废寝忘题的.YK在机房中,花了数个月阅读完了N本网络小说,并且对N本网络小说设定了一个喜爱值,可正 ...
- DTOJ 2313:定价(absurd)
DTOJ 2313:定价(absurd) [题目描述] 在市场上有很多商品的定价类似于 999 元.4999 元.8999 元这样.它们和 1000 元.5000 元和 9000 元并没有什么本质区别 ...
- DTOJ 1587:Hamsters(hamsters)
DTOJ 1587:Hamsters(hamsters) [题目描述] Tz养了一群仓鼠,他们都有英文小写的名字,现在Tz想用一个字母序列来表示他们的名字, 只要他们的名字是字母序列中的一个子串就算, ...
- 推荐一个基于MPV的视频播放器--Baka MPlayer,使用Qt开发的图形界面
MPV 是一个基于 MPlayer 和 mplayer2 的开源极简全能播放器.支持各种视频格式.音频解码.支持特效字幕,不仅支持本地播放,同样支持网络播放.但是可惜没有图形化界面,Baka MPla ...
- 反⑨baka拖更大队:临时约法
本团队中将不时发起团队讨论报道⑨baka无良~ 某无良⑨baka一直拖更引起广大人民群众不满 文文新闻:https://www.luogu.org/discuss/show/52654 反⑨baka的 ...
最新文章
- 本机无法访问虚拟机上的nignx
- 解决sublime3的标签页乱码(小方块)
- 公共闪存接口CFI在Flash Memory程序设计中的应用
- java解析静态AIS原始数据
- linux下的setenv使用
- flex 布局,flex-grow 宽度未等比放大问题解决办法
- JavaMaven【三、常用指令】
- 管理感悟:计划是给谁看的
- TOEFL资料 280多个
- 干货| 364套各类风格毕业设计答辩PPT模板~
- 高级计量经济学及Stata应用 第2版_陈强
- 《汇编语言》学习(十三)int指令
- JAVA提取纯文本_从常见文档中提取纯文本内容 | IT人生录
- Rxjava--背压(Backpressure)
- 10.23训练赛补题
- 24点游戏(自动生成随机数)
- java怎么实现华为云文字识别,华为云语音识别:一句话识别API调用
- Python namedtuple ——具名元组
- HTML,css和JavaScript的基础学习—JavaScript篇
- 拥抱400GE新引擎,跨越新基建的时代龙门
热门文章
- c 语言 网络唤醒,Java网络编程————UDP实现ThinkPad S5网络唤醒-Go语言中文社区...
- 统计RGB和YUV图像文件各分量的概率分布,并求出熵
- EL(Expression Language)语言介绍
- iOS自动化之WDA(WebDriverAgent)安装及踩坑(本文仅作经验记录,原WDA已经废弃,详细请看更新说明)
- 程序员如何写好一份简历去找工作?这些地方你一定要注意!
- 交通车辆工程机械高级仪器设备用丙烯酸磁漆 耐化学品性能好
- 聊聊C++11标准库中堆(heap)算法的源码
- 防不胜防,10分钟就被AI骗走430万!真实诈骗案震惊全网
- caoz的梦呓:信息安全,别为了芝麻丢了西瓜
- 浅谈无人机管理的有关规定