欧拉回路、欧拉图及其判定
在一张图上,一条从某个点出发,经过所有的边后回到原点的路径叫做欧拉回路。有欧拉回路的图叫做欧拉图。
容易发现,欧拉图一定是联通图。它还需要满足以下条件:
如果是无向图,那么每个结点的度数都是偶数。
如果是有向图,那么每个结点的入度和出度相等。
不难理解这是判断欧拉图的充要条件。
欧拉回路算法详解
我们先判断图是否是欧拉图,然后通过 DFS 的方法来找欧拉回路。
DFS 一个点的时候,我们每次找到一条没有使用过的边,然后先 DFS 那个点,再将这条边加入答案栈中。最后将栈中的元素倒序输出即可。
为了优化复杂度,我们使用当前弧优化,不难证明时间复杂度为 $O(n + m)$。
1#include
2#include
3using namespace std;
4
5const int maxn = 1e5, maxm = 4e5;
6int type, n, m, deg[maxn + 3], top, st[maxm + 3];
7int tot, ter[maxm + 3], id[maxm + 3], nxt[maxm + 3], lnk[maxn + 3], cur[maxn + 3];
8bool vis[maxm + 3];
9
10void add(int u, int v, int w){
11ter[++tot] = v, id[tot] = w;
12nxt[tot] = l