社区讨论
悬关求调
P3128[USACO15DEC] Max Flow P参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lz6kx8to
- 此快照首次捕获于
- 2024/07/29 13:59 2 年前
- 此快照最后确认于
- 2024/07/29 15:08 2 年前
rt
CPP#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long l;
l n, k, x, y, d[50005], p[50005][20], diff[50005], a[50005];
vector<l> v[50005];
void dfs(l x, l dad) {
d[x] = d[dad] + 1;
p[x][0] = dad;
for (l i(1); (1 << (i - 1)) <= d[x]; ++i) {
p[x][i] = p[p[x][i - 1]][i - 1];
}
for (l y : v[x]) {
if (y != dad) {
dfs(y, x);
}
}
}
l lca(l x, l y) {
if (d[x] < d[y]) swap(x, y);
for (l i(16); i >= 0; --i) {
if (d[p[x][i]] >= d[y]) {
x = p[x][i];
}
}
if (x == y) return x;
for (l i(16); i >= 0; --i) {
if (p[x][i] != p[y][i]) {
x = p[x][i];
y = p[y][i];
}
}
return p[x][0];
}
void dfs2(l x, l dad) {
for (l y : v[x]) {
if (y == dad) continue;
dfs2(y, x);
a[x] += a[y];
}
a[x] += diff[x];
}
int main() {
scanf("%lld%lld", &n, &k);
for (l i(1); i <= n; ++i) {
scanf("%lld%lld", &x, &y);
v[x].push_back(y);
v[y].push_back(x);
}
dfs(1, 0);
while (--k > -1) {
scanf("%lld%lld", &x, &y);
l z(lca(x, y));
diff[x]++;
diff[p[z][0]]--;
diff[y]++;
diff[z]--;
}
dfs2(1, 0);
l ans(0);
for (l i(1); i <= n; ++i) {
ans = max(ans, a[i]);
}
printf("%lld", ans);
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...