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;
}

posted on 2024-07-21 20:39  WHUStar  阅读(1)  评论(0编辑  收藏  举报