求欧拉回路的算法学习

在求解欧拉回路的问题中我们可以采用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\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");
        }
    }
}

 


posted @ 2020-03-30 16:30  LightAc  阅读(862)  评论(0编辑  收藏  举报
返回顶端