P3128 [USACO15DEC] Max Flow P

 >>>tree 入度数==1 回溯路径只有一条

#include<cstdio>
#include<iostream>
#include<algorithm>
//#include<queue>
//#include<vector>
//#include<bits/stdc++.h>
#define ll long long
#define ddd printf("-----------------------\n");
using namespace std;
const int maxn=5e4+10 ;

int head[maxn],to[maxn<<1],nxt[maxn<<1],tot;
int fa[maxn][25],dep[maxn];
int dif[maxn];
int n,k,ans;

void add(int u,int v){
    to[++tot]=v,nxt[tot]=head[u],head[u]=tot;
}

void dfs1(int u,int faa)
{
    dep[u]=dep[faa]+1,fa[u][0]=faa;
    for(int i=1;i<=20;i++) fa[u][i]=fa[fa[u][i-1]][i-1];
    for(int i=head[u];i;i=nxt[i])
    {
        int v=to[i]; if(v==faa) continue;
        dfs1(v,u);
    }
}
int LCA(int u,int v)
{
    if(dep[u]<dep[v]) swap(u,v);
    for(int i=20;i>=0;i--){
        if(dep[fa[u][i]]>=dep[v])    u=fa[u][i];//
        if(u==v) return u;
    }
    for(int i=20;i>=0;i--){
        if(fa[u][i]!=fa[v][i]) u=fa[u][i],v=fa[v][i];
    }
    return fa[u][0];
}

void dfs2(int u,int faa)
{
    
    for(int i=head[u];i;i=nxt[i])
    {
        int v=to[i];if(v==faa) continue;
        dfs2(v,u);
        dif[u]+=dif[v];
    }
    if(ans<dif[u]) ans=dif[u];
     
}
int main()
{
    ios::sync_with_stdio(false);
    cin>>n>>k;
    for(int i=1;i<=n-1;i++){
        int u,v;cin>>u>>v;
        add(u,v),add(v,u);
    }
    dfs1(1,1);
    
    for(int i=1;i<=k;i++){
        int u,v;cin>>u>>v;
        dif[u]++,dif[v]++,dif[LCA(u,v)]--,dif[fa[LCA(u,v)][0]]--;
    }
    dfs2(1,1);
    
    cout<<ans<<'\n';
    
    return 0;
}
View Code

 

posted @ 2023-08-23 14:48  JMXZ  阅读(5)  评论(0)    收藏  举报