【题目描述】

给定一颗有方向的树,改变一条边方向的代价为 $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相关推荐

  1. #3316. baka

    题目描述 Worldwide_D最近沉迷东方. 数学课上,Worldwide_D在研究对数,然后渐渐睡着了.他梦见自己躺在幻想乡的雾之湖边,听见旁边有两个妖精在对话,原来是Cirno和Daiyouse ...

  2. bzoj 3316: JC loves Mkk(二分+单调队列)

    3316: JC loves Mkk Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1047  Solved: 339 [Submit][Status] ...

  3. 【DTOJ】2701:问候

    DTOJ 2701:问候  解题报告 2017.11.08 第一版 --由翱翔的逗比w原创,引用yzl_rex的CSDN博客 题目信息: 题目描述 问候人类! 输入 输入一行,一个名字,如human( ...

  4. DTOJ 1486:分数(score)

    DTOJ 1486:分数(score) [题目描述] [输入] 第一行包含两个正整数N和P,表示选手的个数以及精度要求. 接下来的N行,每行包含一个0到100(闭区间)内的整数. [输出] 输出一个实 ...

  5. DTOJ 1552:网络小说分组(novel)

    DTOJ 1552:网络小说分组(novel) [题目描述] YK酷爱阅读网络小说,读起来便是没日没夜废寝忘题的.YK在机房中,花了数个月阅读完了N本网络小说,并且对N本网络小说设定了一个喜爱值,可正 ...

  6. DTOJ 2313:定价(absurd)

    DTOJ 2313:定价(absurd) [题目描述] 在市场上有很多商品的定价类似于 999 元.4999 元.8999 元这样.它们和 1000 元.5000 元和 9000 元并没有什么本质区别 ...

  7. DTOJ 1587:Hamsters(hamsters)

    DTOJ 1587:Hamsters(hamsters) [题目描述] Tz养了一群仓鼠,他们都有英文小写的名字,现在Tz想用一个字母序列来表示他们的名字, 只要他们的名字是字母序列中的一个子串就算, ...

  8. 推荐一个基于MPV的视频播放器--Baka MPlayer,使用Qt开发的图形界面

    MPV 是一个基于 MPlayer 和 mplayer2 的开源极简全能播放器.支持各种视频格式.音频解码.支持特效字幕,不仅支持本地播放,同样支持网络播放.但是可惜没有图形化界面,Baka MPla ...

  9. 反⑨baka拖更大队:临时约法

    本团队中将不时发起团队讨论报道⑨baka无良~ 某无良⑨baka一直拖更引起广大人民群众不满 文文新闻:https://www.luogu.org/discuss/show/52654 反⑨baka的 ...

最新文章

  1. 本机无法访问虚拟机上的nignx
  2. 解决sublime3的标签页乱码(小方块)
  3. 公共闪存接口CFI在Flash Memory程序设计中的应用
  4. java解析静态AIS原始数据
  5. linux下的setenv使用
  6. flex 布局,flex-grow 宽度未等比放大问题解决办法
  7. JavaMaven【三、常用指令】
  8. 管理感悟:计划是给谁看的
  9. TOEFL资料 280多个
  10. 干货| 364套各类风格毕业设计答辩PPT模板~
  11. 高级计量经济学及Stata应用 第2版_陈强
  12. 《汇编语言》学习(十三)int指令
  13. JAVA提取纯文本_从常见文档中提取纯文本内容 | IT人生录
  14. Rxjava--背压(Backpressure)
  15. 10.23训练赛补题
  16. 24点游戏(自动生成随机数)
  17. java怎么实现华为云文字识别,华为云语音识别:一句话识别API调用
  18. Python namedtuple ——具名元组
  19. HTML,css和JavaScript的基础学习—JavaScript篇
  20. 拥抱400GE新引擎,跨越新基建的时代龙门

热门文章

  1. c 语言 网络唤醒,Java网络编程————UDP实现ThinkPad S5网络唤醒-Go语言中文社区...
  2. 统计RGB和YUV图像文件各分量的概率分布,并求出熵
  3. EL(Expression Language)语言介绍
  4. iOS自动化之WDA(WebDriverAgent)安装及踩坑(本文仅作经验记录,原WDA已经废弃,详细请看更新说明)
  5. 程序员如何写好一份简历去找工作?这些地方你一定要注意!
  6. 交通车辆工程机械高级仪器设备用丙烯酸磁漆 耐化学品性能好
  7. 聊聊C++11标准库中堆(heap)算法的源码
  8. 防不胜防,10分钟就被AI骗走430万!真实诈骗案震惊全网
  9. caoz的梦呓:信息安全,别为了芝麻丢了西瓜
  10. 浅谈无人机管理的有关规定