#樹上差分#[luogu 3128] [USACO15DEC]最大流Max Flow

題目

https://www.luogu.com.cn/problem/P3128


解題思路

樹上差分。


代碼

#pragma GCC optimize("O2")
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#include<cstdio>
#include<algorithm>
#include<string>
#define maxn 50010
#define rep(i,x,y) for(register int i=x;i<=y;i++)
using namespace std; 
struct node{int y,next;}a[maxn<<2];
int head[maxn<<2],d[maxn],n,m,c[maxn],f[maxn][25],ans,tot; 
inline void add(int x,int y){a[++tot]=(node){y,head[x]}; head[x]=tot;}
inline int read(){
	int p=0; char c=getchar(); 
	while (!isdigit(c)) c=getchar(); 
	while (isdigit(c)) p=(p<<3)+(p<<1)+c-48,c=getchar(); 
	return p; 
}
inline void dfs(int x,int fa){
	d[x]=d[fa]+1,f[x][0]=fa; 
	for(register int i=0;i<=20;i++) f[x][i+1]=f[f[x][i]][i]; 
	for(int i=head[x];i;i=a[i].next) if (a[i].y!=fa) dfs(a[i].y,x); 
}
inline int lca(int x,int y){
	if (d[x]>d[y]) swap(x,y); 
	for(int i=20;i>=0;i--) if (d[x]<=d[y]-(1<<i)) y=f[y][i]; 
	if (x==y) return x; 
	for(int i=20;i>=0;i--) if (f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i]; 
	return f[x][0]; 
}
inline void Getans(int x,int fa){
	for(register int i=head[x];i;i=a[i].next) 
		if (a[i].y!=fa) Getans(a[i].y,x),c[x]+=c[a[i].y]; 
	ans=max(ans,c[x]);  
}
signed main(){
	n=read(),m=read(); 
	int x,y,l; 
	rep(i,1,n-1){
		x=read(),y=read();
		add(x,y),add(y,x); 
	}
	dfs(1,0); 
	rep(i,1,m){
		x=read(),y=read(); 
		l=lca(x,y),c[x]++,c[y]++,c[l]--,c[f[l][0]]--; 
	}
    Getans(1,0);
	return 0&printf("%d",ans); 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章