• 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;
    }
  • 相关阅读:
    MySQL数据库安装和基本使用
    Android studio JNI技术实现与本地C++链接
    笔记 java中i++ 和 ++i的区别
    LaTeX中添加usepackage{subfigure}一直报错的解决办法,亲测
    Android Studio 出现“Cannot resolve symbol” 解决办法
    记录一个sql
    linux 文件内容查找、去重、统计
    MVC框架的模板缓存
    Linux 命令学习
    笔记 :PHP中的数据结构库SPL
  • 原文地址:https://www.cnblogs.com/SFWR-YOU/p/11067186.html
Copyright © 2020-2023  润新知