P3128 [USACO15DEC] Max Flow P
链接
https://www.luogu.com.cn/problem/P3128
题目
分析
LCA+树上差分。思路就是先定义1为根节点,然后进行dfs1的预处理,配置好LCA的环境。然后条件思路就是端点++,lca--,lca的父亲(fa[lca][0])--。最后再做树上前缀和。就是从根节点开始跑dfs,每个节点的值等于所有子树的值的和。进行一遍dfs即可。代码
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<algorithm>
#include<math.h>
#include<sstream>
#include<string>
#include<string.h>
#include<iomanip>
#include<stdlib.h>
#include<map>
#include<queue>
#include<limits.h>
#include<climits>
#include<fstream>
#include<stack>
#define IOS ios::sync_with_stdio(false), cin.tie(0) ,cout.tie(0)
using namespace std;
#define int long long
const int N = 5e4 + 10;
struct Edge { int to, next; }edge[2*N];
int head[N*2];
int cnt;
int ans = 0;
int deep[N], fa[N][20];
int tree[N];
void init(int n)
{
for (int i = 1; i <= n; i++)edge[i].to = edge[i].next = head[i] = -1;
}
void addedge(int u, int v)
{
edge[cnt].next = head[u], edge[cnt].to = v; head[u] = cnt++;
}
void dfs1(int u, int father)
{
deep[u] = deep[father] + 1;
fa[u][0] = father;
for (int i = 1; (1 << i) <= deep[u]; i++)
fa[u][i] = fa[fa[u][i - 1]][i - 1];
for (int x = head[u]; x != -1; x = edge[x].next)
{
if (edge[x].to != father)
dfs1(edge[x].to, u);
}
}
int LCA(int x, int y)
{
if (deep[x] < deep[y])swap(x, y);
for (int i = 19; i >= 0; i--)
if (deep[x] - (1 << i) >= deep[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, int fa)
{
for (int i = head[x]; i != -1; i = edge[i].next)
{
int xnow = edge[i].to;
if (xnow == fa)continue;
dfs(xnow, x);
tree[x] += tree[xnow];
}
ans = max(ans, tree[x]);
}
signed main()
{
IOS;
int n, k;
cin >> n >> k;
init(n);
for (int i = 1; i < n; i++)
{
int u, v; cin >> u >> v;
addedge(u, v); addedge(v, u);
}
dfs1(1, 0);
for (int i = 1; i <= k; i++)
{
int x, y; cin >> x >> y;
int root_pub = LCA(x, y);
int root_fa = fa[root_pub][0];
tree[x]++, tree[y]++, tree[root_fa]--, tree[root_pub]--;
}
dfs(1, 0);
cout << ans;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现