社区讨论

救命,树上差分+树剖LCA,必关

P3128[USACO15DEC] Max Flow P参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mi1a2kbj
此快照首次捕获于
2025/11/16 13:31
4 个月前
此快照最后确认于
2025/11/17 09:10
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
int n,k,ans,siz[50005],son[50005],top[50005],dep[50005],fa[50005],dis[50005];
vector <int> G[50005];
inline void dfs(int u,int f){
	dep[u] = dep[f]+1;
	siz[u] = 1;
	fa[u] = f;
	for (int i = 0;i < G[u].size();i++){
		int v = G[u][i];
		if (v == f) continue;
		dfs(v,u);
		siz[u] += siz[v];
		if (siz[v] > siz[son[u]]) son[u] = v;
	}
}
inline void dfs2(int u,int topu){
	top[u] = topu;
	if (son[u]) dfs2(son[u],topu);
	for (int i = 0;i < G[u].size();i++){
		int v = G[u][i];
		if (v == fa[u] || v == son[u]) continue;
		dfs2(v,v);
	}
}
void dfs3(int u){
	ans = max(ans,dis[u]+siz[u]-1);
	for (int i = 0;i < G[u].size();i++){
		int v = G[u][i];
		if (v == fa[u]) continue;
		dfs3(v);
	}
}
inline int lca(int x,int y){
	while (top[x] != top[y]){
		if (dep[top[x]] < dep[top[y]]) swap(x,y);
		x = fa[top[x]];
	}
	return dep[x] < dep[y] ? x : y;
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin >> n >> k;
	int u,v;
	for (int i = 1;i < n;i++){
		cin >> u >> v;
		G[u].push_back(v),G[v].push_back(u);
	}
	dfs(1,0);
	dfs2(1,1);
	dis[1] = 1;
	while (k--){
		cin >> u >> v;
		int LCA = lca(u,v);
		dis[u]++,dis[v]++;
		dis[LCA]--,dis[fa[LCA]]--;
	}
	dfs3(1);
	cout << ans;
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...