[USACO15DEC] 最大流Max Flow && Tarjan 线性 LCA 教学?
显然是树上差分模板题啦,不知道树上差分的童鞋可以去百度一下,很简单。
然后顺带学了一下 tarjan 的 O(N+Q) 离线求LCA的算法 (准确的说难道不应该带个并查集的复杂度吗???)
算法过程具体可以看这里
这里说一下我的理解。
大概可以把所有点分成三类(对于每个dfs的状态):已经遍历到的并且不在dfs栈中的点,已经遍历到并且在dfs栈中的点,未被遍历到的点。
其中,第二种的所有点构成了当前的右链。
然后dfs的过程就是,每个节点的子树遍历完了之后,它自己也就变成了第一种点,我们把这颗子树并到这个节点爸爸上。注意,此时它的爸爸必然是第二种节点。
稍加推理我们就可以发现,任意时刻每个前两种节点所在的并查集的根必然是它最近的一个第二种节点的祖先(如果是第二种节点就是它自己)。
然后我们每次dfs刚刚进入一个节点x的时候,就先回答涉及它的LCA询问:
1.若另一个点y已经被dfs过了(也即是前两种节点),那么它们的LCA就是 get_root(y)。这并不难理解,因为x在右链上,所以y与x的LCA必然是右链上离y最近的点,也就是get_root(y)。
2.若另一个点y没有被dfs过,那么不用管,因为我们必然会在dfs到y的时候处理x。
这么做之后,每组LCA只会被找一次。
复杂度还是线性的,代码还贼好写w
#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define pb push_back
const int N=50005; inline int read(){
int x=0; char ch=getchar();
for(;!isdigit(ch);ch=getchar());
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
return x;
} vector<int> g[N],ask[N];
int n,m,f[N],a[N],p[N],ans; int gr(int x){ return p[x]==x?x:(p[x]=gr(p[x]));} void dfs(int x,int fa){
f[x]=fa;
for(int i:ask[x]) if(f[i]>=0) a[gr(i)]--,a[f[gr(i)]]--;
for(int i:g[x]) if(i!=fa) dfs(i,x),p[i]=x;
} void update(int x){
for(int i:g[x]) if(i!=f[x]) update(i),a[x]+=a[i];
ans=max(ans,a[x]);
} inline void solve(){
for(int U,V;m;m--)
U=read(),V=read(),a[U]++,a[V]++,ask[U].pb(V),ask[V].pb(U);
memset(f,-1,sizeof(f)),dfs(1,0),update(1);
} int main(){
n=read(),m=read();
for(int i=1;i<=n;i++) p[i]=i;
for(int i=1,U,V;i<n;i++) U=read(),V=read(),g[U].pb(V),g[V].pb(U);
solve(),printf("%d\n",ans);
return 0;
}
[USACO15DEC] 最大流Max Flow && Tarjan 线性 LCA 教学?的更多相关文章
- P3128 [USACO15DEC]最大流Max Flow(LCA+树上差分)
P3128 [USACO15DEC]最大流Max Flow 题目描述 Farmer John has installed a new system of pipes to transport mil ...
- 洛谷P3128 [USACO15DEC]最大流Max Flow
P3128 [USACO15DEC]最大流Max Flow 题目描述 Farmer John has installed a new system of N-1N−1 pipes to transpo ...
- luoguP3128 [USACO15DEC]最大流Max Flow 题解(树上差分)
链接一下题目:luoguP3128 [USACO15DEC]最大流Max Flow(树上差分板子题) 如果没有学过树上差分,抠这里(其实很简单的,真的):树上差分总结 学了树上差分,这道题就极其显然了 ...
- 洛谷P3128 [USACO15DEC]最大流Max Flow [树链剖分]
题目描述 Farmer John has installed a new system of pipes to transport milk between the stalls in his b ...
- 洛谷P3128 [USACO15DEC]最大流Max Flow (树上差分)
###题目链接### 题目大意: 给你一棵树,k 次操作,每次操作中有 a b 两点,这两点路上的所有点都被标记一次.问你 k 次操作之后,整棵树上的点中被标记的最大次数是多少. 分析: 1.由于数 ...
- 洛谷P3128 [USACO15DEC]最大流Max Flow [倍增LCA]
题目描述 Farmer John has installed a new system of pipes to transport milk between the stalls in his b ...
- 题解 P3128 【[USACO15DEC]最大流Max Flow】
此类型题目有两种比较常见的做法:树链剖分和树上差分. 本题有多组修改一组询问,因此树上差分会比树链剖分优秀很多. 这里两种方法都进行介绍. 树链剖分和树上差分的本质都是将一颗树转换为一个区间,然后进行 ...
- luogu P3128 [USACO15DEC]最大流Max Flow (树上差分)
题目描述 Farmer John has installed a new system of N-1N−1 pipes to transport milk between the NN stalls ...
- 树上差分——点差分裸题 P3128 [USACO15DEC]最大流Max Flow
讲解: https://rpdreamer.blog.luogu.org/ci-fen-and-shu-shang-ci-fen #include <bits/stdc++.h> #def ...
随机推荐
- 【BFS】Help the Princess!
题目描述 The people of a certain kingdom make a revolution against the bad government of the princess. T ...
- SAS学习笔记6 算数语句(sum、mean、min、max函数)
sum:求和 mean:平均值 min:最小值 max:最大值
- 用python将项目中的所有代码(或txt)合并在一个文件中
设计模式开卷考试给的例子代码都是一个类一个java,实在太恶心了,所以写了一个python脚本. import os fileansdir=r'C:\Users\tonyson_in_the_rain ...
- 数据库中间件之mycat安装部署(一)
在学习数据库中间件前,我们先抛出三个问题 1.数据库数据量不大,但并发读写操作很大,应该怎么办? 此时我们首先考虑使用缓存中间件来减轻读压力,如果不能满足则考虑数据库读写分离,此时就会引入新的问题,这 ...
- [JZOJ5897]密匙--哈希骚操作
[JZOJ5897]密匙--哈希骚操作 题目链接 太懒了自行Google 前置技能 二分/倍增求LCP e.g TJOI2017DNA 分析 这题看了样例解释才知道什么意思 本以为自己身为mo法师蛤希 ...
- input 默认提示文字 样式修改(颜色,大小,位置)
input::-webkit-input-placeholder{ color:red; font-size:20px; ...... }
- 封装promise
// new 做了什么 //1.创建一个新的空对象 //2.将构造函数中的this指向这个新空对象 //3.执行构造函数中的代码 //4.返回这个对象 //5.这个对象有一个__proto__指向构造 ...
- Flutter中的替换路由、返回到根路由
替换路由 当我们有三个页面,页面1,页面2,页面3. 期望点击页面1按钮,跳转到页面2,页面2点击返回,跳转到页面1: 点击页面2按钮,跳转到页面3,页面3点击返回,跳转到页面1,而不是页面2. 这时 ...
- 网络设备驱动程序-netdevice结构体关键部分注释
仅仅做个记录,内核4.19 struct net_device { char name[IFNAMSIZ]; //网络设备的名称 struct hlist_node name_hlist; char ...
- idou老师教你学Istio12 : Istio 实现流量镜像
微服务为我们带来了快速开发部署的优秀特性,而如何降低开发和变更的风险成为了一个问题.Istio的流量镜像,也称为影子流量,是将生产流量镜像拷贝到测试集群或者新的版本中,在引导实时流量之前进行测试,可以 ...