P3128 [USACO15DEC] Max Flow P(树上差分)

2024-01-21 01:52

本文主要是介绍P3128 [USACO15DEC] Max Flow P(树上差分),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

FJ 给他的牛棚的 N 个隔间之间安装了 N−1 根管道,隔间编号从 1 到 N。所有隔间都被管道连通了。

FJ 有 K 条运输牛奶的路线,第 i 条路线从隔间 si​ 运输到隔间 ti​。一条运输路线会给它的两个端点处的隔间以及中间途径的所有隔间带来一个单位的运输压力,你需要计算压力最大的隔间的压力是多少。

第一行输入两个整数 N 和 K。

接下来 N−1 行每行输入两个整数 x 和 y,其中 x=y。表示一根在牛棚 x 和 y 之间的管道。

接下来 K 行每行两个整数 s 和 t,描述一条从 s 到 t 的运输牛奶的路线。

输出格式

An integer specifying the maximum amount of milk pumped through any stall in the barn.

一个整数,表示压力最大的隔间的压力是多少。

输入输出样例

输入 #1复制

5 10
3 4
1 5
4 2
5 4
5 4
5 4
3 5
4 3
4 3
1 3
3 5
5 4
1 5
3 4

输出 #1复制

9

说明/提示

2≤N≤5×104,1≤K≤105

解析:

差分可以便捷的记录一连串的数字相加同一个数。

差分也可以用再树上进行计算路径通过最短点两点个次数。

遍历从1到个个叶子节点的次数。

处理公共祖先和公共祖先的父节点。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 5e5 + 10,M = 2*N;
int h[N],to[M],ne[M],tot;
int fa[N][22];
int dep[N];
int n,m,ans,power[N];void add(int a,int b){to[++tot] = b,ne[tot] = h[a],h[a] = tot;
}void dfs(int u,int f){dep[u] = dep[f]+1,fa[u][0] = f;for(int i = 0;fa[u][i];++i){fa[u][i+1] = fa[fa[u][i]][i];}for(int i  = h[u];i;i = ne[i]){if(to[i] != f) dfs(to[i],u);}
} 
int lca(int u,int v){ // 最近公共祖先 if(dep[u] > dep[v]) swap(u,v); for(int  i = 20;i >=0 ;i--){if(dep[u]  <= dep[v]- (1 <<i )){v = fa[v][i];}}if(u == v) return u;for(int i = 20;i >= 0;i--){if(fa[u][i] != fa[v][i]){u = fa[u][i],v = fa[v][i];}}return fa[u][0];
}
void dfs2(int u,int f){for(int i = h[u];i;i = ne[i]){ //看那个管道压力大 int v = to[i];if(v == f) continue;dfs2(v,u);power[u] += power[v];}ans = max(ans,power[u]);
}
int main(){scanf("%d%d",&n,&m);for(int i = 1,x,y;i < n;i++){scanf("%d%d",&x,&y);add(x,y);add(y,x);}dfs(1,0);for(int i = 1,x,y;i <= m;i++){scanf("%d%d",&x,&y);int l = lca(x,y);++power[x];++power[y];//这个是遍历到根节点,所以两个++ --power[l];//公共根节点-1  --power[fa[l][0]];//父节点再-1    相当于-2因为公共根节点-1了 }dfs2(1,0);printf("%d",ans);return 0;
}

这篇关于P3128 [USACO15DEC] Max Flow P(树上差分)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/628025

相关文章

poj 3159 (spfa差分约束最短路) poj 1201

poj 3159: 题意: 每次给出b比a多不多于c个糖果,求n最多比1多多少个糖果。 解析: 差分约束。 这个博客讲差分约束讲的比较好: http://www.cnblogs.com/void/archive/2011/08/26/2153928.html 套个spfa。 代码: #include <iostream>#include <cstdio>#i

poj 3169 spfa 差分约束

题意: 给n只牛,这些牛有些关系。 ml个关系:fr 与 to 牛间的距离要小于等于 cost。 md个关系:fr 与 to 牛间的距离要大于等于 cost。 隐含关系: d[ i ] <= d[ i + 1 ] 解析: 用以上关系建图,求1-n间最短路即可。 新学了一种建图的方法。。。。。。 代码: #include <iostream>#include

POJ 1364差分约束

给出n个变量,m个约束公式 Sa + Sa+1 + .... + Sa+b < ki or > ki ,叫你判断是否存在着解满足这m组约束公式。 Sa + Sa+1   +   .+ Sa+b =  Sum[a+b] - Sum[a-1]  . 注意加入源点n+1 。 public class Main {public static void main(Strin

GNSS CTS GNSS Start and Location Flow of Android15

目录 1. 本文概述2.CTS 测试3.Gnss Flow3.1 Gnss Start Flow3.2 Gnss Location Output Flow 1. 本文概述 本来是为了做Android 14 Gnss CTS 的相关环境的搭建和测试,然后在测试中遇到了一些问题,去寻找CTS源码(/cts/tests/tests/location/src/android/locat

file-max与ulimit的关系与差别

http://zhangxugg-163-com.iteye.com/blog/1108402 http://ilikedo.iteye.com/blog/1554822

Python中差分进化differential_evolution的调用及参数说明

在场景应用中,要求我们的函数计算结果尽可能的逼近实际测量结果,可转化计算结果与测量结果的残差,通过最小化残差,便可求出最优的结果。但使用最小二乘等方法来计算时,常常会使迭代的结果显然局部最优点而导致结算错误。 差分进化原理 差分进化(Differential Evolution,DE)是一种基于群体差异的进化算法,其计算思想主要包括以下几个方面: 一、初始化种群 首先,随机生成一个初始种群

Understanding the GitHub Flow

这里看下Github的入门介绍    --链接 GitHub Flow is a lightweight, branch-based workflow that supports teams and projects where deployments are made regularly. This guide explains how and why GitHub Flow works

POJ 1050 To the Max(枚举+动规)

题目: http://poj.org/problem?id=1050 题解: 此题转化成一维后就相当于求最大连续子序列了,可以枚举所有的行组合,把枚举到的起始行到终止行的值按列相加存入一个一维数组。 代码: #include<cstdio>#include<cstring>int a[101][101];int value[101];int dp[101];int max(

Versioned Staged Flow-Sensitive Pointer Analysis

VSFS 1.Introduction2.Approach2.1.相关概念2.2.VSFS 3.Evaluation参考文献 1.Introduction 上一篇blog我介绍了目前flow-sensitive pointer analysis常用的SFS算法。相比IFDS-based方法,SFS显著通过稀疏分析提升了效率,但是其内部依旧有许多冗余计算,留下了很大优化空间。 以

报错:Reached the max session limit(DM8 达梦数据库)

报错:Reached the max session limit - - DM8 达梦数据库 1 环境介绍2 数据库启动SYSTEM IS READY后面日志3 数据库刚启动日志4 达梦数据库学习使用列表 1 环境介绍 某项目无法连接数据库,报错:超过最大会话数限制 , 检查 dmdba ulimit -a openfiles 已改检查 dm.ini 其中 MAX_SESSION