洛谷 P4630 [APIO2018] Duathlon 铁人两项(圆方树)

本文介绍了如何解决洛谷上的APIO2018 Duathlon问题,重点在于利用圆方树进行树型DP。针对无向图,通过构建圆方树,并对圆点赋予负权值(-1)来抵消重复计数,同时方点的贡献乘以点双大小以考虑所有可能的中点。给出了相关代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接
这题一直忘做了
考虑只是一棵树的情况,我们可以枚举中点,显然每个点作为中点产生的贡献就是经过它的所有路径的条数,这是一个很简单的树型DP
那么对于无向图而言,我们只要建出圆方树,就可以跑同样思路的树型DP,我们对于方点记录它所表示的点双的大小,因为两个点之间路径经过的任意一个点双上的任意一个点都可以做中点,所以方点的贡献要额外乘以点双的大小,但显然这样会有重复,得去重,考虑两个点之间的简单路径上有多少贡献是重复的,显然起点终点不行,两个方点中间的圆点算两遍,所以圆点权值设为-1就可以了

代码如下:

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

vector<int> g[100010],g2[400010];
int vis[400010],dfn[400010],low[400010],sta[400040],r[400040],size[400040],top,cnt,tot,n,m;
long long ans=0,sum;

void tarjan(int now)
{
   
	dfn[now]=low[now]=++cnt;
	sta[++top]=now;
	sum++;
	for(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值