洛谷P3128 [USACO15DEC]最大流Max Flow

https://www.luogu.org/problem/P3128

#include<bits/stdc++.h>
using namespace std;
const int maxn=100000+100;

int n,k;
vector<int> G[maxn];
int fa[maxn][20],deep[maxn],d[maxn],ans;

void dfs(int u,int f)
{
    for(int i=0;i<G[u].size();i++)
    {
        int v=G[u][i];
        if(v==f)continue;
        fa[v][0]=u;
        deep[v]=deep[u]+1;
        dfs(v,u);
    }
}

void lca_init()
{
    for(int i=1;i<=n;i++)for(int j=1;(1<<j)<n;j++)fa[i][j]=-1;
    for(int j=1;(1<<j)<n;j++)
        for(int i=1;i<=n;i++)
            if(fa[i][j-1]!=-1)
            {
                int a=fa[i][j-1];
                fa[i][j]=fa[a][j-1];
            }
}

int lca(int p,int q)
{
    int log;
    if(deep[p]<deep[q])swap(p,q);
    for(log=1;(1<<log)<=deep[p];log++);
    log--;
    int ans=-(1<<30);
    for(int i=log;i>=0;i--)
        if(deep[p]-(1<<i)>=deep[q])
        {
            p=fa[p][i];
        }
    if(p==q)return p; //lca爲p或q
    for(int i=log;i>=0;i--)
        if(fa[p][i]!=-1 && fa[p][i]!=fa[q][i])
        {
            p=fa[p][i];
            q=fa[q][i];
        }
    return fa[p][0];//lca爲fa[p]或fa[q]
}

int dfs2(int u,int f)
{
    int cnt=d[u];
    for(int i=0;i<G[u].size();i++)
    {
        int v=G[u][i];
        if(v==f)continue;
        cnt+=dfs2(v,u);
    }
    ans=max(ans,cnt);
    return cnt;
}

int main()
{
    cin>>n>>k;
    int a,b;
    for(int i=1;i<n;i++)
    {
        scanf("%d%d",&a,&b);
        G[a].push_back(b);
        G[b].push_back(a);
    }
    fa[1][0]=-1;
    deep[1]=0;
    dfs(1,-1);
    lca_init();
    while(k--)
    {
        scanf("%d%d",&a,&b);
        int x=lca(a,b);
        d[a]++;d[b]++;
        d[x]--;
        if(fa[x][0]>0)d[fa[x][0]]--;
    }
    dfs2(1,-1);
    cout<<ans<<endl;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章