思路:

欧拉回路的判断方法是:图中所有点的度数都为偶数且图是连通的。如果这个条件不满足,那么就不存在欧拉回路。如果满足这个条件,那么就可以用深度优先搜索或者广度优先搜索找到一条欧拉回路,具体实现可以采用递归或者栈的方式。

在输出欧拉回路的时候,要按照字典序最小的方式输出,可以先对边进行排序,从小到大依次遍历边,每次遍历到一条边就把这条边从边集合中删除,然后继续遍历下一条边,直到所有的边都被遍历过了。

代码实现:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXN 1000
#define MAXM 100000

int n, m, tot;
int head[MAXN], deg[MAXN];
int fa[MAXN], vis[MAXM], ans[MAXM];
struct Edge {
    int u, v, nxt, id;
} e[MAXM];

int find(int x) {
    return fa[x] == x ? x : fa[x] = find(fa[x]);
}

void add_edge(int u, int v, int id) {
    e[++tot].u = u;
    e[tot].v = v;
    e[tot].id = id;
    e[tot].nxt = head[u];
    head[u] = tot;
}

void dfs(int u, int &cnt) {
    for (int i = head[u]; i; i = e[i].nxt) {
        if (!vis[e[i].id]) {
            vis[e[i].id] = 1;
            int v = e[i].v;
            dfs(v, cnt);
            ans[cnt--] = e[i].id;
        }
    }
}

int cmp(const void *a, const void *b) {
    return ((Edge *)a)->id - ((Edge *)b)->id;
}

int main() {
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; ++i) fa[i] = i;
    for (int i = 1; i <= m; ++i) {
        int u, v;
        scanf("%d%d", &u, &v);
        add_edge(u, v, i);
        add_edge(v, u, i);
        ++deg[u];
        ++deg[v];
        int fu = find(u), fv = find(v);
        if (fu != fv) fa[fu] = fv;
    }
    int cnt = 0, flag = 1;
    for (int i = 1; i <= n; ++i) {
        if (deg[i] & 1) {
            flag = 0;
            break;
        }
        if (fa[i] == i) ++cnt;
    }
    if (!flag || cnt > 1) {
        printf("NULL\n");
        return 0;
    }
    cnt = m;
    for (int i = 1; i <= n; ++i) {
        if (deg[i]) {
            qsort(e + head[i], deg[i], sizeof(Edge), cmp);
            break;
        }
    }
    for (int i = 1; i <= n; ++i) {
        if (deg[i]) {
            dfs(i, cnt);
            break;
        }
    }
    for (int i = 1; i <= m; ++i) {
        printf("%d ", ans[i]);
    }
    printf("\n");
    return 0;
}

时间复杂度:$O(m\log m)$

用C语言实现欧拉回路的判断输入的第一行是两个正整数n和m其中n表示顶点个数m表示边数接下来的m行每行两个整数a和b表示点a和b 之间有一条边输出一条欧拉回路。如果存在多条回路输出字典顺序最小的一条回路。如果不存在回路输出NULL。

原文地址: https://www.cveoy.top/t/topic/cK42 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录