洛谷 P3128 [USACO15DEC] Max Flow P
洛谷 P3128 [USACO15DEC] Max Flow P
题意
给定一棵
思路
树上差分模版。
维护
对于每个点对
因为
最后遍历一遍数计算答案即可。
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 5e4 + 5;
int tot, ver[N << 1], nxt[N << 1], head[N];
int n, k, fa[N][20], de[N];
ll a[N], ans;
void add(int x, int y) {
ver[++ tot] = y;
nxt[tot] = head[x];
head[x] = tot;
}
void DFS(int x) {
de[x] = de[fa[x][0]] + 1;
for (int i = 1; i <= 19; i ++)
fa[x][i] = fa[fa[x][i - 1]][i - 1];
for (int i = head[x], y; i; i = nxt[i]) {
y = ver[i];
if (y == fa[x][0]) continue;
fa[y][0] = x;
DFS(y);
}
}
inline int LCA(int x, int y) {
if (de[x] < de[y]) swap(x, y);
for (int i = 19; i >= 0; i --)
if (de[fa[x][i]] >= de[y]) x = fa[x][i];
if (x == y) return x;
for (int i = 19; i >= 0; i --)
if (fa[x][i] != fa[y][i]) x = fa[x][i], y = fa[y][i];
return fa[x][0];
}
void dfs(int x) {
for (int i = head[x], y; i; i = nxt[i]) {
y = ver[i];
if (y == fa[x][0]) continue;
dfs(y); a[x] += a[y]; // 前缀和
}
}
int main() {
cin >> n >> k;
for (int i = 1, u, v; i < n; i ++) {
cin >> u >> v;
add(u, v); add(v, u);
}
DFS(1);
for (int i = 1, u, v; i <= k; i ++) {
cin >> u >> v;
a[u] ++, a[v] ++, a[fa[LCA(u, v)][0]] --, a[LCA(u, v)] --; // 差分
}
dfs(1); // 统计答案
for (int i = 1; i <= n; i ++) ans = max(ans, a[i]);
cout << ans << "\n";
return 0;
}
本文来自博客园,作者:maniubi,转载请注明原文链接:https://www.cnblogs.com/maniubi/p/18384230,orz
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)