树上差分例1 「 USACO15DEC 」最大流Max Flow 「 luogu P3128 」

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/violinlove/article/details/83217561

emmm,树上差分(点差分)裸题,

\large s->t      

                    \large ans[s]++; ans[t]++; ans[lca(s,t)]--; ans[fa_{lca(s,t)}]--;

对于开始选定的根节点,例如本代码中的1号节点,father(1)应该等于0号点或其他处理办法,不能等于本身

最后取一遍max即可

推荐一篇好的文章:差分数组 and 树上差分 (可略去差分数组内容,剩下的自己整理)

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>

using namespace std;

inline int wread(){
    char c(getchar ());int wans(0),flag(1);
    while (c<'0' || c>'9'){if (c=='-') flag=-1;c=getchar ();}
    while (c>='0' && c<='9'){wans=wans*10+c-'0';c=getchar ();}
    return wans*=flag;
}

inline void OUT (int x){
    if (x>9)	OUT(x/10);
    putchar (x%10+'0');
}

inline void init (){
    freopen (" ","r",stdin);
    freopen (" ","w",stdout);
}

int n,m; 
int K,hed[50006];
struct node{int v,nxt;}e[100006];
void ad (int u,int v){
    e[++K]=(node){v,hed[u]};hed[u]=K;
}
int p[50006][17];
int dep[50006];
int ans[50006];

void dfs (int x,int fa){
    p[x][0]=fa;
    for (int i(1);i<=16;++i)	p[x][i]=p[p[x][i-1]][i-1];
    for (int i(hed[x]);i!=-1;i=e[i].nxt){
        int v(e[i].v);
        if (v==fa)	continue;
        dep[v]=dep[x]+1;
        dfs (v,x);
    }
    return ;
}

int lca (int a,int b){
    if (dep[a]>dep[b])	swap (a,b);
    for (int i(16);i>=0;--i)	
        if (dep[a]<=dep[p[b][i]])	b=p[b][i];
    if (a==b)	return a;
    for (int i(16);i>=0;--i){
        if (p[a][i] == p[b][i])	continue;
        a=p[a][i];b=p[b][i];
    }
    return p[a][0];
}

void getans (int x,int fa){
    for (int i(hed[x]);i!=-1;i=e[i].nxt){
        int v(e[i].v);
        if (v==fa)	continue;
        getans (v,x);
        ans[x]+=ans[v];	
    }
    return ;
}

int main (){
//	init ();
    memset (hed,-1,sizeof hed); 
    n=wread();m=wread();
    for (int i(1);i<n;++i){
        int u(wread()),v(wread());
        ad(u,v);ad(v,u);
    }
    dep[1]=1;
    dfs (1,0);
    while (m--){
        int u(wread()),v(wread());
        ans[u]++;ans[v]++;
        int lca_uv(lca(u,v));
        ans[lca_uv]--;
        ans[p[lca_uv][0]]--;	
    }
    getans(1,0);
    int pr(0);
    for (int i(1);i<=n;++i)
        pr=max (pr,ans[i]);
    printf("%d\n",pr);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/violinlove/article/details/83217561
今日推荐