[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

时间: 2024-10-08 04:50:28

[dfs][模拟网络流] Luogu P4189 星际旅行的相关文章

HDU 5438 Ponds dfs模拟

2015 ACM/ICPC Asia Regional Changchun Online 题意:n个池塘,删掉度数小于2的池塘,输出池塘数为奇数的连通块的池塘容量之和. 思路:两个dfs模拟就行了 1 #include <iostream> 2 #include <cstdio> 3 #include <fstream> 4 #include <algorithm> 5 #include <cmath> 6 #include <deque&

Vijos P1114 FBI树【DFS模拟,二叉树入门】

描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串. FBI树是一种二叉树1,它的结点类型也包括F结点,B结点和I结点三种.由一个长度为2^N的“01”串S可以构造出一棵FBI树T,递归的构造方法如下: 1) T的根结点为R,其类型与串S的类型相同: 2) 若串S的长度大于1,将串S从中间分开,分为等长的左右子串S1和S2:由左子串S1构造R的左子树T1,由右子串S2构造R的右子树T2. 现在给定一个长度为2^N的“0

hdoj ztr loves lucky numbers 5676 (dfs模拟)

ztr loves lucky numbers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 918    Accepted Submission(s): 389 Problem Description ztr loves lucky numbers. Everybody knows that positive integers ar

种树 (堆模拟网络流)

种树 题目描述 cyrcyr今天在种树,他在一条直线上挖了n个坑.这n个坑都可以种树,但为了保证每一棵树都有充足的养料,cyrcyr不会在相邻的两个坑中种树.而且由于cyrcyr的树种不够,他至多会种k棵树.假设cyrcyr有某种神能力,能预知自己在某个坑种树的获利会是多少(可能为负),请你帮助他计算出他的最大获利. 输入输出格式 输入格式: 第一行,两个正整数n,k. 第二行,n个正整数,第i个数表示在直线上从左往右数第i个坑种树的获利. 输出格式: 输出1个数,表示cyrcyr种树的最大获利

HDU 1112 The Proper Key DFS+模拟

这题是我做过的好恶心的模拟题之一,WA了两次,要注意很多细节,主要是题意不好懂.这题题意是给你两个字符矩阵,第一个代表钥匙,第二个代表锁.问你,钥匙能否穿过锁,如若不能,输出钥匙插入锁的最大深度. #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <queue> #define maxn 1000 #define max

POj 3009 Curling 2.0(DFS + 模拟)

题目链接:http://poj.org/problem?id=3009 题意: 题目很复杂,直接抽象化解释了.给你一个w * h的矩形格子,其中有包含一个数字“2”和一个数字“3”,剩下的格子由“0”和“1”组成,目的是计算从“2”走到“3”的最短步数,“1”代表障碍物,“0”代表可以通行.“2”可以往周围四个方向走,如果往某一个方向走,那么停下来的条件是,当这个方向上存在障碍物“1”,且会停在这个障碍物的前一个格子,并会击碎这个障碍物;如果选择的方向上没有障碍物“1”也没有终点“3”,那么就会

蓝桥杯 兰顿蚂蚁 (DFS+模拟)

[题目描述] 历届试题 兰顿蚂蚁 时间限制:1.0s   内存限制:256.0MB 问题描述 兰顿蚂蚁,是于1986年,由克里斯·兰顿提出来的,属于细胞自动机的一种. 平面上的正方形格子被填上黑色或白色.在其中一格正方形内有一只"蚂蚁". 蚂蚁的头部朝向为:上下左右其中一方. 蚂蚁的移动规则十分简单: 若蚂蚁在黑格,右转90度,将该格改为白格,并向前移一格: 若蚂蚁在白格,左转90度,将该格改为黑格,并向前移一格. 规则虽然简单,蚂蚁的行为却十分复杂.刚刚开始时留下的路线都会有接近对称

hdu 4740 The Donkey of Gui Zhou(dfs模拟好题)

Problem Description There was no donkey in the province of Gui Zhou, China. A trouble maker shipped one and put it in the forest which could be considered as an N×N grid. The coordinates of the up-left cell is (0,0) , the down-right cell is (N-1,N-1)

UVALive 6884 GREAT + SWERC = PORTO dfs模拟

题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4896 We want to have a great SWERC at Porto this year and we approached this challenge in several ways.We even framed it as a word add