[dfs][模拟网络流] Luogu P4189 星际旅行
题目描述
公元30003000年,地球联盟已经攻占了银河系内的NN个星球,出于资金的考虑,政府仅仅在星球间建立了N-1N−1条双向时空隧道保证任意两个星球之间互相可达。出于管理上的考虑,第ii个星球的行政长官要求每个公民在一年内不得从该星球利用时空隧道次数超过H_iHi次(这一统计是基于离开次数统计的,如果你已经使用从该星球离开过H_iHi次,那么这一年内你就不能再使用时空隧道离开这个星球了)。Louis Paosen是一个星际旅行家,他希望能使用尽量多次的时空隧道,但又不希望最终被迫定居的星球条件太过恶劣。所以他希望能知道对于每个星球ii,若从00号星球出发,最终以ii号星球为终点,这样的星际旅行途中最多可以使用多少次时空隧道。
题解
首先有一个非常好的条件,每个点的限制次数都大于等于这个点的度数,然后我们可以从0开始dfs一遍这棵树。
然后如果一条边连接的两个点的h同时>0,那么就来回走,然后我们考虑再去从0号节点往每个节点走
如果此时uu的h>0,那么直接走就可以了
否则,那么我们为了从u走到v,必须将上一次uv折返的路程去掉,这样会使v的次数+1,这时如果v的一个儿子的次数不为0,那么还可以继续折返一次
代码
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #define N 50010 5 using namespace std; 6 int head[N],cnt,h[N],ans[N],now,p[N],n; 7 struct edge{ int from,to; }e[N<<1]; 8 void insert(int u,int v){ e[++cnt].from=head[u];e[cnt].to=v;head[u]=cnt; } 9 void dfs(int u,int fa) 10 { 11 for (int i=head[u],x,v;i;i=e[i].from) 12 if (e[i].to!=fa) 13 { 14 v=e[i].to,dfs(v,u),x=min(h[u],h[v]); 15 now+=x*2,h[u]-=x,h[v]-=x; 16 if (h[v]) p[u]=v; 17 } 18 } 19 void dfs2(int u,int fa) 20 { 21 ans[u]=now; 22 for (int i=head[u];i;i=e[i].from) 23 if (e[i].to!=fa) 24 { 25 int v=e[i].to; 26 if (h[u]) h[u]--,now++,dfs2(v,u),h[u]++,now--; 27 else if (p[v]) h[p[v]]--,now++,dfs2(v,u),h[p[v]]++,now--; 28 else h[v]++,now--,dfs2(v,u),h[p[v]]--,now++; 29 } 30 } 31 int main() 32 { 33 scanf("%d",&n); 34 for (int i=1;i<=n;i++) scanf("%d",&h[i]); 35 for (int i=1,u,v;i<n;i++) scanf("%d%d",&u,&v),u++,v++,insert(u,v),insert(v,u),h[u]--,h[v]--,now+=2; 36 dfs(1,0),dfs2(1,0); 37 for (int i=1;i<=n;i++) printf("%d\n",ans[i]); 38 }
转载于:https://www.cnblogs.com/Comfortable/p/11237274.html
[dfs][模拟网络流] Luogu P4189 星际旅行相关推荐
- 736. Lisp 语法解析 : DFS 模拟题
题目描述 这是 LeetCode 上的 736. Lisp 语法解析 ,难度为 困难. Tag : 「DFS」.「模拟」.「哈希表」 给你一个类似 Lisp 语句的字符串表达式 expression, ...
- 历届试题 核桃的数量(3个数的最小公倍数),翻硬币(贪心),买不到的数目(在范围内暴力,找范围,最小公倍数是上界,最小的数是下界),兰顿蚂蚁(dfs,模拟)
历届试题 核桃的数量 问题描述 小张是软件项目经理,他带领3个开发组.工期紧,今天都在加班呢.为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑).他的要求是: 各组的核桃数量必须相同 各组内必须能 ...
- HDU4801 转魔方、DFS模拟
题目 HDU 4801 给出一个两阶魔方的初始形态,一次可以将一个面转动90° 求在N(1<=N<=7)步内最多能拼成几个面. 题解 由于是两阶魔方,左边UP等于右边DOWN,因此共有6种 ...
- hdu 1298 字典树 + DFS (模拟T9文本输入)
题意: 给你一些按键顺序,让你输出每一步中概率最大的那个单词,这里的概率计算方 法好好看看别弄错了,一开始就是因为弄错了,各种wa,比如 abc 1 ,ab 1,那么 ab 的概率就是2 ...
- NOIP模拟测试5「星际旅行·砍树·超级树」
星际旅行 0分 瞬间爆炸. 考试的时候觉得这个题怎么这么难, 打个dp,可以被儿子贡献,可以被父亲贡献,还有自环,叶子节点连边可以贡献,非叶子也可以贡献,自环可以跑一回,自环可以跑两回, 关键是同一子 ...
- UVALive 6884 GREAT + SWERC = PORTO dfs模拟
题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show ...
- 翻转棋 dfs+模拟
题目描述 农夫约翰知道,聪明的奶牛可以产更多的牛奶.他为奶牛设计了一种智力游戏,名叫翻转棋.翻转棋可以分成M × N (1 ≤ M, N ≤ 15)个格子,每个格子有两种颜色,一面是黑的,一面是白的. ...
- URAL 2013 Neither shaken nor stirred dfs 模拟
题目链接:点击打开链接 题意: 给定n个点的有向图: 下面n行,第一个数字表示点权,后面一个数字m表示有m条边. 起点是1. 对于每个点,输出2个值表示前驱点权1和该点点权2. 1.若有多条路径到达该 ...
- 斗地主(dfs+模拟)
问题 I: 斗地主 时间限制: 1 Sec 内存限制: 128 MB 题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克 ...
最新文章
- win7实用技巧之十——卷影副本
- 浙江工商大学计算机学院调剂录取,浙江工商大学2017年硕士研究生调剂拟录取名单公布(持续更新)...
- 25/100. Palindrome Linked List
- maven中的groupId和artifactId到底指的是什么?
- ajax异步注册代码,基于AJAX用户注册信息异步校验
- 一文带你了解数据中心大二层网络演进之路
- 七年级计算机工作计划,七年级下学期信息技术教学计划(最新整理)
- spring思想分析
- 【codevs3290】华容道
- 【链表】Remove Duplicates from Sorted List II(三指针)
- git 从远程仓库指定分支clone代码到本地
- cad插入块_软件CAD | 块amp;点工具
- 刷机精灵Android版V3.0,刷机精灵V3.0版发布,开启全新刷机时代
- disp语句怎么格式 matlab_matlab输出语句print
- 教学实验平台之三极管放大特性测试
- Visual Studio Code开发HTML安装教程及简易示例
- win7如何通过电脑系统开启无线热点
- 冒号后面跟着function()是什么意思
- html 实时计算字数,JavaScript 实现textarea限制输入字数, 输入框字数实时统计更新,输入框实时字数计算移动端bug解决...
- ios高德地图提醒打开定位功能
热门文章
- 迎新年html,迎接新年年的句子
- 2021-12-30大数据学习日志——Hadoop离线阶段——HDFS
- matlab的workspace在哪,matlab中的workspace
- jquery日历插件 途牛_11个实用jQuery日历插件
- 2021语音识别领域最具商业合作价值企业盘点
- 中国医科大学计算机本科在线作业,17秋中国医科大学《大学英语1(本科)》在线作业答案...
- 【雷锋网】网友亲历诈骗!安全专家详解:一个验证码如何让你倾家荡产
- Android美女一键换肤
- SAP GUI 最新版本7.70于2021年1月29日发布了
- DNA大分子是什么样子?