社区讨论
救命,树上差分+树剖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 条回复,欢迎继续交流。
正在加载回复...