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; }

浙公网安备 33010602011771号