题解 洛谷 P4189 【[CTSC2010]星际旅行】
一个比较直接的想法就是对每个点进行拆点,拆成入点和出点,限制放在入点和出点相连的边上,然后跑最大费用最大流即可。
但是这样复杂度无法接受,所以考虑模拟费用流来解决本题。
发现 \(H\) 都大于等于该节点的度数,所以从根节点出发,一定可以到达所有节点。
先考虑以根节点为起点和终点的答案,首先可以遍历整棵树后回到根节点,每条边的两个端点的 \(H\) 都减一,答案加二。然后继续考虑每条边的贡献,若其两个端点在遍历后 \(H\) 不为 \(0\),则可以反复走这条边,直到其中一个端点的 \(H\) 为 \(0\)。
得出根节点的答案后,考虑如何推出其他点的答案。设当前节点为 \(x\),当前考虑的儿子为 \(y\)。若 \(H_x\) 不为 \(0\),则可以直接从 \(x\) 走到 \(y\),使答案加一。若 \(H_x\) 为 \(0\),那么从 \(y\) 到 \(x\) 后从 \(x\) 就无法到达 \(y\),所以进行反悔退流,将原先 \(y\) 到 \(x\) 的一个流退掉,如果此时 \(y\) 存在一个儿子的 \(H\) 不为 \(0\),那么其就可以反复走和这个儿子相连的边,使答案加一,若没有,则答案减一。
同时还要注意在 \(dfs\) 时需要回溯。
#include<bits/stdc++.h>
#define maxn 100010
using namespace std;
template<typename T> inline void read(T &x)
{
x=0;char c=getchar();bool flag=false;
while(!isdigit(c)){if(c=='-')flag=true;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
if(flag)x=-x;
}
int n,tot;
int v[maxn],ans[maxn],son[maxn];
struct edge
{
int to,nxt;
}e[maxn];
int head[maxn],edge_cnt;
void add(int from,int to)
{
e[++edge_cnt]=(edge){to,head[from]};
head[from]=edge_cnt;
}
void dfs_pre(int x,int fa)
{
for(int i=head[x];i;i=e[i].nxt)
{
int y=e[i].to,val;
if(y==fa) continue;
dfs_pre(y,x),val=min(v[x],v[y]);
v[x]-=val,v[y]-=val,tot+=val*2;
if(v[y]) son[x]=y;
}
}
void dfs_ans(int x,int fa)
{
ans[x]=tot;
for(int i=head[x];i;i=e[i].nxt)
{
int y=e[i].to,type;
if(y==fa) continue;
if(v[x]) v[x]--,tot++,type=1;
else if(son[y]) v[son[y]]--,tot++,type=2;
else v[y]++,tot--,type=3;
dfs_ans(y,x);
if(type==1) v[x]++,tot--;
if(type==2) v[son[y]]++,tot--;
if(type==3) v[y]--,tot++;
}
}
int main()
{
read(n);
for(int i=1;i<=n;++i) read(v[i]);
for(int i=1;i<n;++i)
{
int x,y;
read(x),read(y),x++,y++;
add(x,y),add(y,x),v[x]--,v[y]--,tot+=2;
}
dfs_pre(1,0),dfs_ans(1,0);
for(int i=1;i<=n;++i) printf("%d\n",ans[i]);
return 0;
}
题解 洛谷 P4189 【[CTSC2010]星际旅行】的更多相关文章
- 题解 洛谷P5018【对称二叉树】(noip2018T4)
\(noip2018\) \(T4\)题解 其实呢,我是觉得这题比\(T3\)水到不知道哪里去了 毕竟我比较菜,不大会\(dp\) 好了开始讲正事 这题其实考察的其实就是选手对D(大)F(法)S(师) ...
- 题解 洛谷 P3396 【哈希冲突】(根号分治)
根号分治 前言 本题是一道讲解根号分治思想的论文题(然鹅我并没有找到论文),正 如论文中所说,根号算法--不仅是分块,根号分治利用的思想和分块像 似却又不同,某一篇洛谷日报中说过,分块算法实质上是一种 ...
- 题解-洛谷P5410 【模板】扩展 KMP(Z 函数)
题面 洛谷P5410 [模板]扩展 KMP(Z 函数) 给定两个字符串 \(a,b\),要求出两个数组:\(b\) 的 \(z\) 函数数组 \(z\).\(b\) 与 \(a\) 的每一个后缀的 L ...
- 题解-洛谷P4229 某位歌姬的故事
题面 洛谷P4229 某位歌姬的故事 \(T\) 组测试数据.有 \(n\) 个音节,每个音节 \(h_i\in[1,A]\),还有 \(m\) 个限制 \((l_i,r_i,g_i)\) 表示 \( ...
- 题解-洛谷P4724 【模板】三维凸包
洛谷P4724 [模板]三维凸包 给出空间中 \(n\) 个点 \(p_i\),求凸包表面积. 数据范围:\(1\le n\le 2000\). 这篇题解因为是世界上最逊的人写的,所以也会有求凸包体积 ...
- 题解-洛谷P4859 已经没有什么好害怕的了
洛谷P4859 已经没有什么好害怕的了 给定 \(n\) 和 \(k\),\(n\) 个糖果能量 \(a_i\) 和 \(n\) 个药片能量 \(b_i\),每个 \(a_i\) 和 \(b_i\) ...
- 题解-洛谷P5217 贫穷
洛谷P5217 贫穷 给定长度为 \(n\) 的初始文本 \(s\),有 \(m\) 个如下操作: \(\texttt{I x c}\),在第 \(x\) 个字母后面插入一个 \(c\). \(\te ...
- 题解 洛谷 P2010 【回文日期】
By:Soroak 洛谷博客 知识点:模拟+暴力枚举 思路:题目中有提到闰年然后很多人就认为,闰年是需要判断的其实,含有2月29号的回文串,前四位是一个闰年那么我们就可以直接进行暴力枚举 一些小细节: ...
- 题解 洛谷P2158 【[SDOI2008]仪仗队】
本文搬自本人洛谷博客 题目 本文进行了一定的更新 优化了 Markdown 中 Latex 语句的运用,加强了可读性 补充了"我们仍不曾知晓得 消失的 性质5 ",加强了推导的严谨 ...
随机推荐
- FastJson对实体类和Json还有JSONObject相互转换
1. 实体类或集合转JSON串 String besnString = JSONObject.toJSONString(实体类); 2.JSON串转JSONObject JSONObject json ...
- Linux远程连接mongodb
当没有客户端工具,eg:robo3T时,如何修改mongodb里的数据呢? 1.连接mongodb服务器mongo 1.1.1.1:1688 2.查看数据库列表show dbs 3.选择使用log库u ...
- skywalking面板功能介绍2
场景: spring-user调用spring-order 1.spring-user部署了两个应用实例 2.spring-order部署了一个实例 应用详情信息在表 从上面表中可以看出spring- ...
- linux网络编程-socket(2)
当客户端调用close函数的时候,服务器的read函数读到的数据是0读到文件结束通知,表示对端关闭了tcp连接 我们现实实现下面的功能: 1.tcp客户端从标准的输入流中得到输入数据发送到服务器,服务 ...
- MyBatis学习笔记(2)--缓存
一.什么是缓存 --存在于内存中的临时数据. 为什么使用缓存?--减少和数据库的交互次数,提高执行效率. 适用于缓存的数据: 1.经常查询并且不经常改变的数据. 2.数据的正确与否对最终结果影响较小的 ...
- RS232/485通信方式 保存和加载时数据的处理
RS232/485通信方式 数据以RS232/485方式通信时,以0xA5作为开始码,以0xAE作为结束码.在开始码和结束码之间的0xA5, 0xAA, 0xAE数据需要进行转码. PC端发送数据时将 ...
- Nginx 从入门到放弃(二)
学习完了nginx的基本知识后,我们来了解下nginx的虚拟主机. 说到虚拟主机,那就得说一说虚拟主机的三种方式了 基于端口的虚拟主机 基于域名的虚拟主机 基于ip的虚拟主机 基于端口实现虚拟主机 只 ...
- 2020年,web前端还好找工作吗?
好不好找是个相对概念,如果你要跟几年前相比,那么一定是「相对不好找」.原因所学的知识过时 用 Vue 模仿一个饿了么就能找工作的时代一去不复返. 但是为什么现在一堆大厂喊着招聘难呢? 那是因为候选人技 ...
- elasticsearch7.6 安装 并且开启外网访问,真的好累。
下载 下载页面 https://www.elastic.co/cn/downloads/elasticsearch wget https://artifacts.elastic.co/download ...
- Mybatis一对一映射resultMap子标签中顺序问题
直接上图 鼠标点上红线出现如下提示 The content of element type "resultMap" must match "(constructor?, ...