P3128 [USACO15DEC]Max Flow P
P3128 [USACO15DEC]Max Flow P
樹(shù)上差分之點(diǎn)差分模板題
題目描述:
FJ給他的牛棚的N(2≤N≤50,000)個(gè)隔間之間安裝了N-1根管道,隔間編號(hào)從1到N。所有隔間都被管道連通了。
FJ有K(1≤K≤100,000)條運(yùn)輸牛奶的路線,第i條路線從隔間si運(yùn)輸?shù)礁糸gti。一條運(yùn)輸路線會(huì)給它的兩個(gè)端點(diǎn)處的隔間以及中間途徑的所有隔間帶來(lái)一個(gè)單位的運(yùn)輸壓力,你需要計(jì)算壓力最大的隔間的壓力是多少。
題解:
樹(shù)上差分 分為 點(diǎn)差分 和 邊差分
點(diǎn)差分:
比如講紅色到綠色路徑上的點(diǎn)都+x,求差分?jǐn)?shù)組那么我們就對(duì)紅色點(diǎn)和綠色點(diǎn)分別加上x(chóng),對(duì)黃色點(diǎn)減x,對(duì)黃色點(diǎn)的父親節(jié)點(diǎn)減x。為什么呢?點(diǎn)差分求和時(shí)是從葉子節(jié)點(diǎn)開(kāi)始往根上并,因?yàn)槲覀兗t綠都加x,合并時(shí)黃色就會(huì)加兩個(gè)x(一個(gè)來(lái)自左邊,一個(gè)右邊),所以黃色要減x,為了避免影響到其他路徑,所以黃色節(jié)點(diǎn)的父親節(jié)點(diǎn)要減x,其實(shí)跟數(shù)組的差分本質(zhì)也是一樣的
邊差分:
同樣是對(duì)紅色到綠色的路徑加x,我們要在黃色點(diǎn)處減2x,這樣就使得加x的效果只局限在u…v,不會(huì)向lca(u,v)的爸爸蔓延。這是邊的累加情況,仔細(xì)考慮考慮
黃色點(diǎn)是紅和綠的lca,所以還要用到lca算法
代碼:
#include<bits/stdc++.h> typedef long long ll; using namespace std; inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w; } int siz; const int maxn=5e4+9; vector<int>edge[maxn]; int fa[maxn][30],dep[maxn],dt[maxn]; void dfs(int x) {for(int i=1;i<=siz;i++){fa[x][i]=fa[fa[x][i-1]][i-1];}for(int i=0;i<edge[x].size();i++){int v=edge[x][i];if(v!=fa[x][0]){fa[v][0]=x;dep[v]=dep[x]+1;dfs(v);}} } int LCA(int u,int v) {if(dep[u]<dep[v])swap(u,v);int de=dep[u]-dep[v];for(int x=0;x<=siz;x++){if((1<<x)&de)u=fa[u][x];}if(u==v)return u;for(int x=siz;x>=0;x--){if(fa[u][x]!=fa[v][x]){u=fa[u][x];v=fa[v][x];}} return fa[u][0]; } int ans=0; void dfs_cnt(int x) {for(int i=0;i<edge[x].size();i++){int v=edge[x][i];if(v!=fa[x][0]){dfs_cnt(v);dt[x]+=dt[v];}ans=max(ans,dt[x]);} } int main() {int n,m;cin>>n>>m;siz=log2(n);for(int i=1;i<n;i++){int x,y;cin>>x>>y;edge[x].push_back(y);edge[y].push_back(x);}dfs(1);for(int i=1;i<=m;i++){int x,y;cin>>x>>y;int z=LCA(x,y);dt[z]--;dt[fa[z][0]]--;dt[x]++;dt[y]++;}dfs_cnt(1);cout<<ans<<endl;return 0; }總結(jié)
以上是生活随笔為你收集整理的P3128 [USACO15DEC]Max Flow P的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: CPU虚拟化的三种技术
- 下一篇: Codeforces Round #69