[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];//当前的