懶得寫前言
板題: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\n",ans[i]); }
原文:https://www.cnblogs.com/superminivan/p/10657025.html