当前位置: 首页 > news >正文

树形结构溯源dp

codeforces题目链接 - F. Gardening Friends

//yigan_Eins
#include <bits/stdc++.h>
using namespace std;

using i32 = int;
using u32 = unsigned int;
using i64 = long long;
using u64 = unsigned long long;
//using i128 = __int128;
//using u128 = unsigned __int128;

#define int long long
#define pb emplace_back
#define all(x) (x).begin(),(x).end()
#define all2(x) (x).begin() + 1,(x).end()
typedef long long ll;
typedef pair<int,int> PII;

const ll inf = 4e18;
ll P = 1e9 + 7;
const ll MOD = 998244353;
const ll MAX_INT = 2147483647;//2e9
const ll MAX_LL = 9223372036854775807;//9e18

ll gcd(ll a,ll b){return b == 0 ? a : gcd(b,a % b);}
ll lcm(ll a,ll b){return a / gcd(a,b) * b;}
ll qmi(ll a,ll b)
{
	ll res = 1;
	while(b)
	{
		if(b & 1)res = res * a % P;
		a = a * a % P;
		b >>= 1;
	}
	return res;
}
ll inv(ll x){return qmi(x,P - 2);}
ll mo(ll x){return (x % P + P) % P;}
struct CMP
{
	bool operator () (const array<int,4> &f1,const array<int,4> &f2)
	{
		return f1[0] > f2[0];//为true后一个值放到堆顶
	}
};
void YES(bool ok)
{
	cout << (ok ? "YES" : "NO") << '\n';
}
void Yes(bool ok)
{
	cout << (ok ? "Yes" : "No") << '\n';
}
void print(vector<string> a)
{
	for(auto x : a) {
		cout << x << " ";
	}
	cout << '\n';
}

int dx[] = {0,0,1,-1,-1,1,1,-1};
int dy[] = {1,-1,0,0,1,1,-1,-1};


const ll N = 2e5 + 9;

vector<int> g[N];


void solve(int t_id)
{
	int n,k,c;cin >> n >> k >> c;
	for(int i = 1;i <= n - 1;i++) {
		int u,v;cin >> u >> v;
		g[u].push_back(v);
		g[v].push_back(u);
	}
	
	//处理每个节点到底部的最大高度
	vector<int> d(n + 1);
	auto dfs = [&](auto &&self,int u,int fa) -> void {
		int res = 0;
		for(auto y : g[u]) {
			if(y == fa)continue;
			self(self,y,u);
			res = max(res,d[y]);
		}
		d[u] = res + 1;
	};
	
	int ans = 0;
	//fa_d为父节点不经过u节点的最大高度,res为转移根的成本
	auto dfs1 = [&](auto &&self,int u,int fa,int fa_d,int res) -> void {
		vector<PII> vt;
		int ma = 0;
		for(auto y : g[u]) {
			if(y == fa)continue;
			vt.push_back({d[y],y});
			ma = max(ma,d[y]);
		}
		sort(all(vt),greater<PII>());
		ans = max(ans,max(fa_d + 1,ma) * k - res);
//		cout << u << " " << fa_d + 1 << " " << max(fa_d + 1,ma) << " " << res << '\n';
		for(auto y : g[u]) {
			if(y == fa)continue;
			//更新fa_d
			int ress = fa_d + 1;
			if(vt.size()) {
				if(vt[0].second == y) { //子节点的最大高度经过y
					if(vt.size() >= 2) { //取次大高度
						ress = max(ress,vt[1].first);
					}
				}
				else ress = max(ress,vt[0].first); //子节点的最大高度不经过y,取最大高度
			}
			self(self,y,u,ress,res + c);
		}
	};
	
	dfs(dfs,1,0);
	
	dfs1(dfs1,1,0,-1,0);
	cout << ans << '\n';
	
	//
	for(int i = 1;i <= n;i++) {
		g[i].clear();
	}
}


signed main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int t = 1;
	cin >> t;
	for(int i = 1;i <= t;i++) {
		solve(i);
	}
	return 0;
}

相关文章:

  • DeepSeek 本地化部署教程
  • Hyperliquid 遇袭「拔网线」、Polymarket 遭治理攻击「不作为」,从双平台危机看去中心化治理的进化阵痛
  • 方阵幂次(矩阵快速幂)
  • 计算机等级考试数据库三级(笔记3)
  • GPT4o漫画制作(小白教程)
  • MATLAB 控制系统设计与仿真 - 31
  • AUTOSAR Mcal SPI - 基于Ifx TC37x
  • 地下水砷超标处理技术解析
  • 邪性!Anaconda安装避坑细节Windows11
  • RPC 同步与异步之使用Spring WebFlux + WebClient或Netty + Reactor
  • ruoyi-vue部署 linux 系统项目安装部署 oa 项目部署 (合集)
  • 2025年湖南建筑安全员B证备考资料
  • 【AI论文】LEGO拼图:大型语言模型在多步骤空间推理方面的表现如何?
  • 【SPP】蓝牙串口协议(SPP)深度解析:从 RS232 仿真到设备互联的技术实现
  • 基于深度学习的图像超分辨率技术研究与实现
  • 格雷码、汉明码,CRC校验的区别
  • Vue3.X项目中包依赖的解析与安装出现问题如何解决?
  • 21天Python计划:python下载和开发工具介绍
  • 【Linux】进程的详讲(上)
  • 开源测试用例管理平台
  • 调教亲妹妹做性奴网站/新品上市的营销方案
  • 网络课程系统网站建设费用/优化搜狗排名
  • 嘉兴市城乡规划建设管理委员会门户网站/百度网页
  • wordpress换域名后缩略图不显示/焦作seo公司
  • 建设工程类招标信息发布网站/bing搜索引擎入口官网
  • 网站怎么做才被收录快/国家再就业免费培训网