Luogu P2731 骑马修栅栏 Riding the Fences(欧拉回路模板)

gate

保证有欧拉回路,输出路径

这道题的话是字典序,实现的时候从1到n枚举就好了,先不管它qwq

找到度数为奇数的的点作为起点(没有的话就任意一个),

dfs,回溯时把点压进栈。

为什么不能遍跑dfs边压?考虑这张图:

边跑边压的结果是1,2,3,2,4,5,而正解(回溯)是1,2,4,5,2,3

代码如下

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#define MogeKo qwq
using namespace std;

const int maxn = 505;
int m,x,y,s,cnt,to[maxn][maxn],inn[maxn],ans[maxn];

void dfs(int x) {
    for(int i = 1; i <= 500; i++)
        if(to[x][i]) {
            to[x][i]--;
            to[i][x]--;
            dfs(i);
        }
    ans[++cnt] = x;
}

int main() {
    scanf("%d",&m);
    for(int i = 1; i <= m; i++) {
        scanf("%d%d",&x,&y);
        to[x][y]++;
        to[y][x]++;
        inn[x]++;
        inn[y]++;
    }
    s = 1;
    for(int i = 1; i <= 500; i++)
        if(inn[i]%2 != 0) {
            s = i;
            break;
        }
    dfs(s);
    for(int i = cnt; i; i--)
        printf("%d
",ans[i]);
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/mogeko/p/11863593.html