求欧拉回路的算法学习

在求解欧拉回路的问题中我们可以采用fleury算法。

 

 然而在进行算法竞赛时,如果只是求欧拉回路我们可以采用DFS进行实现,需要注意的小细节时在输出边时需要在回溯阶段逆向输出因为遇到 1->2->3->2->1这种图会出现走死路情况

来看道例题:

UVA10054

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <bits/stdc++.h>
using namespace std;
const int N = 55;
int g[N][N];
int d[N];
int n;
void euler(int u) {
    for(int v = 1; v <= 50; ++v){
        if(g[u][v]) {
            g[u][v]--;
            g[v][u]--;
            euler(v);
            printf("%d %d\n", v, u);    //一定是逆序输出
        }
    }
}
 
 
int main () {
    int T;
    scanf("%d", &T);
    for(int t = 1; t <= T; ++t) {
        int u, v;
        memset(g, 0, sizeof g);
        memset(d, 0, sizeof d);
        scanf("%d", &n);
        for(int i = 1; i <= n; ++i){
            scanf("%d%d", &u, &v);
            d[u]++;
            d[v]++;
            g[u][v]++; 
            g[v][u]++;
        }
        printf("Case #%d\n", t);
        bool is = 1;
        for(int j = 1; j <= 50; ++j) {
            if(d[j] % 2) {
                is = 0;
                break;
            }
        }
        if(!is) {
            // printf("some heads may be lost\n");
            printf("some beads may be lost\n");
        }
        else {
            for(int i = 1; i <= 50; ++i) {
                 euler(i);
            }
        }
        if(t != T) {
            printf("\n");
        }
    }
}

 

1
 
posted @   LightAc  阅读(877)  评论(0编辑  收藏  举报
编辑推荐:
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
阅读排行:
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Ai满嘴顺口溜,想考研?浪费我几个小时
· Browser-use 详细介绍&使用文档
· 软件产品开发中常见的10个问题及处理方法
历史上的今天:
2019-03-30 牛客比赛3月29日
2019-03-30 HDU1007
返回顶端
点击右上角即可分享
微信分享提示