树上差分

 [USACO15DEC]最大流Max Flow

时空限制1000ms / 128MB

题目描述

Farmer John has installed a new system of N1 pipes to transport milk between the N stalls in his barn (2N50,000), conveniently numbered1N. Each pipe connects a pair of stalls, and all stalls are connected to each-other via paths of pipes.

FJ is pumping milk between K pairs of stalls (1K100,000). For the iith such pair, you are told two stalls si and ti, endpoints of a path along which milk is being pumped at a unit rate. FJ is concerned that some stalls might end up overwhelmed with all the milk being pumped through them, since a stall can serve as a waypoint along many of the K paths along which milk is being pumped. Please help him determine the maximum amount of milk being pumped through any stall. If milk is being pumped along a path from si to ti, then it counts as being pumped through the endpoint stalls si and

ti, as well as through every stall along the path between them.

FJ给他的牛棚的N(2≤N≤50,000)个隔间之间安装了N-1根管道,隔间编号从1到N。所有隔间都被管道连通了。

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

输入输出格式

输入格式:

The first line of the input contains N and K.

The next N1 lines each contain two integers x and y (xy) describing a pipe

between stalls x and y.

The next K lines each contain two integers s and t describing the endpoint

stalls of a path through which milk is being pumped.

输出格式:

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

barn.

输入输出样例

输入样例: 
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
输出样例: 
9

树上差分裸题,mark一下写法。
参考博客:
https://www.cnblogs.com/ice-wing/p/7709311.html
https://blog.csdn.net/Fine_rose/article/details/77991839
#include<bits/stdc++.h>
#define N 60000
using namespace std;

long long cf[N];
vector<int>edges[N];
int grand[N][25]={0};
int depth[N],DEPTH,n;

void dfs(int x)
{
    for(int i=1;i<=DEPTH;i++)
    {
        grand[x][i]=grand[grand[x][i-1]][i-1];
    }

    for(int i=0;i<edges[x].size();i++)
    {
        int to=edges[x][i];
        if(grand[x][0]==to)continue;

        depth[to]=depth[x]+1;
        grand[to][0]=x;
        dfs(to);
    }
}

void init(int s)
{
    DEPTH=floor(log(n+ 0.0) / log(2.0));
    depth[s]=1;
    memset(grand,0,sizeof(grand));
    dfs(s);
}

int lca(int a,int b)
{
    if(depth[a]>depth[b])swap(a,b);

    for(int i=DEPTH;i>=0;i--)
    if(depth[a]<depth[b]&&depth[grand[b][i]]>=depth[a])
    b=grand[b][i];

    for(int i=DEPTH;i>=0;i--)
    if(grand[a][i]!=grand[b][i])
    {
        a=grand[a][i];
        b=grand[b][i];
    }

    if(a!=b)
    {
        return grand[a][0];
    }
    return a;
}

long long ans=0;

long long dfs2(int x)
{
    int Size=edges[x].size();
    for(int i=0;i<Size;i++)
    if(edges[x][i]!=grand[x][0])
    {
        dfs2(edges[x][i]);
        cf[x]+=cf[edges[x][i]];
    }
    
    ans=max(ans,cf[x]);
}


int main()
{
    int k;
    scanf("%d %d",&n,&k);
    for(int i=0;i<n-1;i++)
    {
        int u,v;
        scanf("%d %d",&u,&v);
        edges[u].push_back(v);
        edges[v].push_back(u);
    }
    
    init(1);
    
    while(k--)
    {
        int u,v;
        scanf("%d %d",&u,&v);
        cf[u]++;
        cf[v]++;
        int t=lca(u,v);
        cf[t]--;
        cf[grand[t][0]]--;
    }
    dfs2(1);
    printf("%lld",ans);
    return 0;
}
View Code


 
原文地址:https://www.cnblogs.com/tian-luo/p/9623754.html