[POI1999]原始生物 题解

[POI1999] 原始生物 题解

题目连接:P5921

题意分析

其实这道题乍一看不像是一道图论的题目,而是构造。

但细分析可以发现,我们可以把该题抽象成一道图论的问题。

该问题等价于:在一个图中,找到所有的连通块,并统计它们对答案的贡献。

连通块贡献的求法

首先我们考虑一般化的情况:

  • 当前的联通块不是一个欧拉回路

那在这个连通块内,每一个点的贡献即为它的入度与出度的最大值。

这里我们可以感性理解一下:

在一个连通块内如果要使答案最优,那必然不能重复走其中的某一条边,如果走了的话答案将会多 22。

所以最优解一定是走一条欧拉路径。

而欧拉路径一定会遍历到所有的边,则每一个点的贡献即为它的入度与出度的最大值。

  • 当前的连通块是一个欧拉回路

由于欧拉回路的起点和终点是重复的点,所以答案应该加 11。

代码实现

更多详细的讲解放在代码里了。

#include <bits/stdc++.h>
using namespace std;
const int N=1000010,M=N*2;
int n,res=0;
int h[N],e[M],ne[M],idx;//邻接表
bool in_gra[N];//字面意思,判断点是否在图中
int dfn[N];//判断是否在dfs的过程中遍历过(tarjan写多了,请见谅)
bool is_oula[N];//当前的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值