POJ 1041 - John's trip(歐拉回路)

題目:

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=90847#problem/A

題意:

求無向圖的歐拉回路是否存在,若存在則輸出字典序最小的路徑。

思路:

先判斷是否存在歐拉回路。

對於無向圖,所有的數的度都爲偶數則存在。

dfs 枚舉邊,得到答案。

AC.

#include <iostream>
#include <cstdio>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>

using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 50;
const int maxm = 2000;

int n, m;
int du[maxn];

struct Edge{
    int u, v;
}edge[maxm];
void addedge(int u, int v, int id)
{
    edge[id].u = u;
    edge[id].v = v;
}

int vis[maxm];
int path[maxm], tol;
void dfs(int u)
{
    int v;
    for(int i = 1; i <= m; ++i) {
        if(vis[i]) continue;
        if(edge[i].u == u) {
            v = edge[i].v;
            vis[i] = 1;
            dfs(v);
            path[tol++] = i;
        }
        else if(edge[i].v == u) {
            v = edge[i].u;
            vis[i] = 1;
            dfs(v);
            path[tol++] = i;
        }
    }
}
void init()
{
    tol = 0;
    memset(du, 0, sizeof(du));
    memset(vis, 0, sizeof(vis));
}
int main()
{
    //freopen("in", "r", stdin);
    int u, v, id;
    while(~scanf("%d%d", &u, &v)) {
        if(u == 0 && v == 0) break;

        init();
        n = 0; m = 0;
        int s;

        scanf("%d", &id);
        addedge(u, v, id);
        n = max(n, max(u, v));
        m = max(m, id);
        if(id == 1) {
            s = min(u, v);
        }
        du[u]++; du[v]++;

        while(1) {
            scanf("%d%d", &u, &v);
            if(u+v == 0) break;
            scanf("%d", &id);

            n = max(n, max(u, v));
            m = max(m, id);
            if(id == 1) {
                s = min(u, v);
            }
            addedge(u, v, id);
            du[u]++; du[v]++;
        }

        bool flag = 1;
        for(int i = 1; i <= n; ++i) {
            if(du[i]%2) {
                flag = 0;
                break;
            }
        }

        if(!flag) printf("Round trip does not exist.\n");
        else {
            dfs(s);
            for(int i = tol-1; i >= 0; --i) {
                printf("%d", path[i]);
                if(i == 0) printf("\n");
                else printf(" ");
            }
        }
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章