求欧拉回路的算法学习

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

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

来看道例题:

UVA10054

#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
", 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
", 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
");
            printf("some beads may be lost
");
        }
        else {
            for(int i = 1; i <= 50; ++i) {
                 euler(i);
            }
        }
        if(t != T) {
            printf("
");
        }
    }
}

作者:LightAc
出处:https://www.cnblogs.com/lightac/
联系:
Email: dzz@stu.ouc.edu.cn
QQ: 1171613053
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/lightac/p/12599397.html