码迷,mamicode.com
首页 > 其他好文 > 详细

欧拉回路 (Euler Circuit)

时间:2015-09-28 00:16:29      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:

http://poj.org/problem?id=1780

相关概念和算法参考:https://www.math.ku.edu/~jmartin/courses/math105-F11/Lectures/chapter5-part2.pdf

#include <cstdio>
#include <cstring>
using namespace std;

#define MAXN    100000
#define MAXM    1000000

struct edge {
    int id;
    int to;
    int next;
};

int adjlist[MAXN]; int nnodes;
edge edges[MAXM]; int nedges;

int stack[MAXM]; int top;
int visited[MAXM];
int result[MAXM + 10]; int nres;

int n; // input

void graph_init() {
    nnodes = 1;
    int k = n - 1;
    while (k--) nnodes *= 10;
    int size = nnodes * sizeof(int);
    memset(adjlist, -1, size);
    nedges = 0;
    top = -1;
    memset(visited, 0, size * 10);
    nres = 0;
}

void add_edge(int u, int v, int eid) {
    edges[nedges].id = eid;
    edges[nedges].to = v;
    edges[nedges].next = adjlist[u];
    adjlist[u] = nedges++;
}

void graph_dfs() {
    stack[++top] = 0;
    printf("%0*d", n-1, 0);
    visited[0] = 1;
    while (top >= 0) {
        int u = stack[top];
        for (int i = adjlist[u]; i != -1; i = edges[i].next) {
            int eid = edges[i].id;
            int v = edges[i].to;
            if (visited[eid] == 0) {
                visited[eid] = 1;
                stack[++top] = v;
                goto cont_while;
            }
        }
        top--;
        result[nres++] = u;
    cont_while: ;
    }
    for (int i = nres - 1; i >= 0; i--) 
        printf("%d", result[i] % 10);
    printf("\n");
}

void solve() {
    graph_init();
    for (int u = 0; u < nnodes; u++) {
        int w = u % (nnodes / 10);
        for (int j = 9; j >= 0; j--) { 
            int v = w * 10 + j;
            add_edge(u, v, u*10+j);
        }
    }
    graph_dfs();
}

int main() {
    while (scanf("%d", &n) != EOF) {
        if (n == 0) break;
        if (n == 1) printf("0123456789\n");
        else solve();
    }
    return 0;
}

 

欧拉回路 (Euler Circuit)

标签:

原文地址:http://www.cnblogs.com/bestofme/p/4842956.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!