POJ2230 Watchcow(欧拉回路)

题目链接

分析:

n个点,m条边,每条边仅且经过两次,输出路径。

题目保证了必然存在一条这样的边,那么直接dfs搜索,搜索的时候把next标记下就可以了。

不过虽然参考别人的过了,还是遇到很多问题,要仔细琢磨琢磨了。

#include <stdio.h>

#define MAXN 10010
#define MAXM 100010

struct node{
    int to;
    int next;
}edge[MAXM];

int head[MAXN], t, vis[MAXM];

void Init(int n, int m){
    int i;
    t = 0;
    for(i=1; i<=n; i++) head[i] = -1;
    for(i=0; i<=m*2; i++) vis[i] = 0;
}

void add(int u, int v){
    edge[t].to = v;
    edge[t].next = head[u];
    head[u] = t++;
}

void euler(int u){
    int i;
    for(i=head[u]; i != -1; i = edge[i].next)if(!vis[i]){
        vis[i] = 1;
        euler(edge[i].to);
    }
    printf("%d\n", u);
}

int main(){
    int n, m, i, u, v;

    scanf("%d %d", &n, &m);

    Init(n, m);

    for(i=0; i<m; i++){
        scanf("%d %d", &u, &v);
        add(u, v); add(v, u);
    }

    euler(1);

    return 0;
}
原文地址:https://www.cnblogs.com/tanhehe/p/2924010.html