[CTSC2010]星际旅行
https://www.luogu.org/problemnew/show/P4189
题解
模拟费用流。
首先有一个非常好的条件,每个点的限制次数都大于等于这个点的度数。
然后我们可以从\(0\)开始\(dfs\)一遍这棵树。
然后如果一条边连接的两个点的\(h\)同时\(>0\),那么就来回走。
然后我们考虑再去从\(0\)号节点往每个节点走。
如果此时\(u\)的\(h>0\),那么直接走就可以了。
如果不是这样,那么我们为了从\(u\)走到\(v\),必须将上一次\(uv\)折返的路程去掉,这样会使\(v\)的次数\(+1\),这时如果\(v\)的一个儿子的次数不为\(0\),那么还可以继续折返一次。
代码
#include<bits/stdc++.h>
#define N 50009
using namespace std;
typedef long long ll;
int head[N],tot,h[N],ans[N],now,p[N],n;
inline ll rd(){
ll x=0;char c=getchar();bool f=0;
while(!isdigit(c)){if(c=='-')f=1;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return f?-x:x;
}
struct edge{
int n,to;
}e[N<<1];
inline void add(int u,int v){
e[++tot].n=head[u];e[tot].to=v;head[u]=tot;
}
void dfs(int u,int fa){
for(int i=head[u];i;i=e[i].n)if(e[i].to!=fa){
int v=e[i].to;
dfs(v,u);
int x=min(h[u],h[v]);
now+=x*2;
h[u]-=x;h[v]-=x;
if(h[v])p[u]=v;
}
}
void dfs2(int u,int fa){
ans[u]=now;
for(int i=head[u];i;i=e[i].n)if(e[i].to!=fa){
int v=e[i].to;
if(h[u]){
h[u]--;now++;
dfs2(v,u);
h[u]++;now--;
}
else if(p[v]){
h[p[v]]--;now++;
dfs2(v,u);
h[p[v]]++;now--;
}
else{
h[v]++;now--;
dfs2(v,u);
h[p[v]]--;now++;
}
}
}
int main(){
n=rd();int u,v;
for(int i=1;i<=n;++i)h[i]=rd();
for(int i=1;i<n;++i){
u=rd()+1;v=rd()+1;
add(u,v);add(v,u);
h[u]--;h[v]--;now+=2;
}
dfs(1,0);
dfs2(1,0);
for(int i=1;i<=n;++i)printf("%d\n",ans[i]);
return 0;
}
[CTSC2010]星际旅行的更多相关文章
- Bzoj1917 [Ctsc2010]星际旅行
Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 185 Solved: 118 Description 公元3000年,地球联盟已经攻占了银河系内的N ...
- 题解 洛谷 P4189 【[CTSC2010]星际旅行】
一个比较直接的想法就是对每个点进行拆点,拆成入点和出点,限制放在入点和出点相连的边上,然后跑最大费用最大流即可. 但是这样复杂度无法接受,所以考虑模拟费用流来解决本题. 发现 \(H\) 都大于等于该 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- [CTSC2010]珠宝商 SAM+后缀树+点分治
[CTSC2010]珠宝商 不错的题目 看似无法做,n<=5e4,8s,根号算法? 暴力一: n^2,+SAM上找匹配点的right集合sz,失配了直接退出 暴力二: O(m) 统计过lca=x ...
- [CTSC2010]性能优化
[CTSC2010]性能优化 循环卷积快速幂 两个注意点:n+1不是2^k*P+1形式,任意模数又太慢?n=2^k1*3^k2*5^k3*7^k4 多路分治!深刻理解FFT运算本质:分治,推式子得到从 ...
- 【BZOJ1921】【CTSC2010】珠宝商(点分治,后缀自动机)
[BZOJ1921][CTSC2010]珠宝商(点分治,后缀自动机) 题面 洛谷 BZOJ权限题 题解 如果要我们做暴力,显然可以以某个点为根节点,然后把子树\(dfs\)一遍,建出特征串的\(SAM ...
- 7.18 NOIP模拟测试5 星际旅行+砍树+超级树
T1 星际旅行 题意:n个点,m条边,无重边,有自环,要求经过m-2条边两次,2条边一次,问共有多少种本质不同的方案.本质不同:当且仅当至少存在一条边经过次数不同. 题解:考试的时候理解错题,以为他是 ...
- P4218 [CTSC2010]珠宝商
P4218 [CTSC2010]珠宝商 神题... 可以想到点分治,细节不写了... (学了个新姿势,sam可以在前面加字符 但是一次点分治只能做到\(O(m)\),考虑\(\sqrt n\)点分治, ...
- 「题解」:07.18NOIP模拟赛T1:星际旅行
问题 A: 星际旅行 时间限制: 1 Sec 内存限制: 256 MB 题面 题面谢绝公开. 考试心路历程 拿到这道题感觉很懵逼,所以先搞的T2和T3,最后码了个暴力,结果还不如直接输出‘0’得分高 ...
随机推荐
- 使用JavaScript弹出Confirm对话框
方法1: 这个比较简单,一句话: <a href="error.htm" onclick="javascript:return confirm('are you s ...
- onload函数和自执行函数的区别(jquery API网址:http://jquery.cuishifeng.cn/)
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- go grpc
https://godoc.org/google.golang.org/grpc go get google.golang.org/grpc go get -a github.com/golang/p ...
- Apache Spark介绍及集群搭建
简介 Spark是一个针对于大规模数据处理的统一分析引擎.其处理速度比MapReduce快很多.其特征有: 1.速度快 spark比mapreduce在内存中快100x,比mapreduce在磁盘中快 ...
- VMWare windows找不到microsoft软件许可条款
提示如下错误: windows找不到microsoft软件许可条款.请确保安装源有效,然后重新启动安装. 解决方案: 把该虚拟机中的系统硬件配置中的软盘去掉. 程序员的基础教程:菜鸟程序员
- 面向对象的JavaScript-002
1. <script type="text/javascript"> // Define the Person constructor var Person = fun ...
- TortoiseSVN教程
TortoiseSVN使用教程 TortoiseSVN是一个SVN的客户端 1.Checkout Repository 首先要Checkout服务器端的Repository,所谓的Checkout就是 ...
- Use formatter to format your JAVA code
In order to make the codes looks unified and make it easy to understand, it's better to use the same ...
- NHibernate获取实体配置信息(表名,列名等等)
// 注意这里有个&符号,并不是写错了,而是约定 就是这样写的ctx.GetObject("&SessionFactory") 这是官网地址http://nhfor ...
- Spring MVC 配置文件
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...