[筆記]歐拉路

懶得寫前言


板題:luogu P2731

1.可能是歐拉路和歐拉迴路相套,但是歐拉迴路可以看成一個點,所以無所謂

2.據題解中說求路徑的問題回溯時記錄結果倒序輸出比較穩妥,一定是符合條件的

3.這道題好像應該記錄點的最大和最小值,不過不記最小也能過

#include<iostream>
#include<cstdio>
using namespace std;
const int maxm=1025;
const int maxn=505;
int n,maxx,minn=maxn;
int a[maxn][maxn];//邻接矩阵 
int ans[maxm+5],cnt,deg[maxn];
void dfs(int x)
{
    for(int i=1;i<=maxx;i++)//優先選擇小的遍歷 
    if(a[i][x]!=0){
        a[i][x]--;a[x][i]--;//把走過的路刪掉,不會重複走 
        dfs(i);
    }
    ans[++cnt]=x;//回溯時記錄,最后倒序输出應該是一定對的 
}
int main()
{
    scanf("%d",&n);
    for(int i=1,x,y;i<=n;i++){
        scanf("%d%d",&x,&y);
        a[x][y]++;a[y][x]++;
        maxx=max(maxx,max(x,y));
        minn=min(minn,min(x,y));
        deg[x]++;deg[y]++;
    }
    for(int i=1;i<=maxx;i++)
    if(deg[i]&1){
        minn=i;break;//欧拉回路还是欧拉路 
    }
    dfs(minn);
//    ans[++cnt]=minn;
    for(int i=cnt;i>=1;i--)
    printf("%d
",ans[i]);
}
原文地址:https://www.cnblogs.com/superminivan/p/10657025.html