【USACO15DEC】最大流Max Flow(樹上差分)
阿新 • • 發佈:2018-12-30
聽了教練的考前須知 蒟蒻緊張的要死 只想做信心題
#include<bits/stdc++.h> #define N 50005 using namespace std; int n,k,tot,first[N]; struct Tree { int to,next; }edge[2*N]; inline void addedge(int x,int y) { tot++; edge[tot].to=y; edge[tot].next=first[x]; first[x]=tot; } int up[N][25],depth[N],diff[N]; void dfs1(int now,int fa) { depth[now]=depth[fa]+1; up[now][0]=fa; for(int i=1;i<=21;i++) up[now][i]=up[up[now][i-1]][i-1]; for(int u=first[now];u;u=edge[u].next) { int vis=edge[u].to; if(vis==fa) continue; dfs1(vis,now); } } inline int lca(int x,int y) { if(depth[x]<depth[y]) swap(x,y); for(int i=21;i>=0;i--) if(depth[up[x][i]]>=depth[y]) x=up[x][i]; if(x==y) return x; for(int i=21;i>=0;i--) if(up[x][i]!=up[y][i]) x=up[x][i],y=up[y][i]; return up[x][0]; } int ans,sum[N]; void dfs2(int now) { sum[now]=diff[now]; for(int u=first[now];u;u=edge[u].next) { int vis=edge[u].to; if(vis==up[now][0]) continue; dfs2(vis); sum[now]+=sum[vis]; } ans=max(ans,sum[now]); } int main() { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin>>n>>k; for(int i=1,x,y;i<n;i++) { cin>>x>>y; addedge(x,y); addedge(y,x); } dfs1(1,0); for(int i=1,x,y,z;i<=k;i++) { cin>>x>>y; z=lca(x,y); diff[x]++; diff[y]++; diff[z]--; diff[up[z][0]]--; } dfs2(1); cout<<ans; return 0; }