求欧拉路径模版 fleury算法
支持多重边,按字典序输出。
#include<bits/stdc++.h> #define REP(i,a,b) for(int i=a;i<=b;i++) #define MS0(a) memset(a,0,sizeof(a)) using namespace std; typedef long long ll; const int maxn=510; const int INF=1e9+10; int n,m; int G[maxn][maxn]; int stk[maxn*3],top; int path[maxn],pcnt; int deg[maxn]; int u,v; void dfs(int u) { stk[++top]=u; REP(v,1,n){ if(G[u][v]){ G[u][v]--;G[v][u]--; dfs(v);break; } } } void fleury(int s) { pcnt=0; top=0;stk[++top]=s; while(top>0){ int flag=1; REP(v,1,n){ if(G[stk[top]][v]){ flag=0;break; } } if(flag) path[++pcnt]=stk[top--]; else dfs(stk[top--]); } } int main() { cin>>n>>m; REP(i,1,m){ scanf("%d%d",&u,&v); G[u][v]++;G[v][u]++; deg[u]++;deg[v]++; } int ss=0,num=0; REP(i,1,n){ if(deg[i]%2){ num++; if(ss==0) s=i; } } if(num==0||num==2) for(int i=pcnt;i>=1;i--) printf("%d ",path[i]);puts(""); else puts("-1"); return 0; }
没有AC不了的题,只有不努力的ACMER!