P3128 [USACO15DEC]最大流Max Flow

——————————————————————————————————————————————————————————

树上差分模板题,综合了差分的思想与LCA的应用

分为点差分与边差分

——————————————————————————————————————————————

#include<bits/stdc++.h>
using namespace std;
struct node{int nxt,to;}eg[50100*2];
int n,dep[50100],fa[50100][22],ne,ans=-100000,m,a,b,head[50100],cf[50100];
void adde(int f,int v){eg[++ne].to=v;eg[ne].nxt=head[f];head[f]=ne;}
void dfs(int u,int f)
{
    for(int i=head[u];i;i=eg[i].nxt)
    {
        if(eg[i].to==f)continue;
        int v=eg[i].to;
        fa[v][0]=u;
        dep[v]=dep[u]+1;
        dfs(v,u);
    }
}
int lca(int x,int y)
{
    if(dep[x]<dep[y])swap(x,y);
    for(int j=20;j>=0;j--)
    if(dep[fa[x][j]]>=dep[y])x=fa[x][j];
    if(x==y)return x;
    for(int j=20;j>=0;j--)
    if(fa[x][j]!=fa[y][j])
    x=fa[x][j],y=fa[y][j];
    return fa[x][0];
}
void dfs2(int u)
{
    for(int i=head[u];i;i=eg[i].nxt)
    {    int v=eg[i].to;
        if(v==fa[u][0])continue;
        dfs2(v);
        cf[u]+=cf[v];
    }
    ans=max(cf[u],ans);
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<n;i++)
    {cin>>a>>b;adde(a,b);adde(b,a);}
    dep[1]=1;dfs(1,0);fa[1][0]=0;
    for(int i=1;i<=20;i++)
    for(int j=1;j<=n;j++)fa[j][i]=fa[fa[j][i-1]][i-1];
    while(m--)
    {
        cin>>a>>b;
        ++cf[a];
        ++cf[b];
        --cf[lca(a,b)];
        --cf[fa[lca(a,b)][0]];
    }
    dfs2(1);
    cout<<ans;
}
原文地址:https://www.cnblogs.com/SFWR-YOU/p/11067186.html