算法:Fleury算法
問題:歐拉通路和歐拉回路問題
輸入:無向圖
輸出:路徑上的點的序列,每條邊的訪問方向
#include<bits/stdc++.h>
using namespace std;
const int maxn=1000+1;
const int maxm=3000+1;
const int INF=0x7fffffff;
typedef long long LL;
// data structure
struct node{
int to, nxt;
int vis;
}edge[2*maxm];
int head[maxn],deg[maxn],tot;
void init_edge(int n){
tot=0;
for(int i=1;i<=n;i++){
deg[i]=0;
head[i]=-1;
}
}
void add_edge(int u, int v){
edge[tot]=node{v,head[u],0};
head[u]=tot++;
edge[tot]=node{u,head[v],0};
head[v]=tot++;
}
// Fleury's resources
int n; // amount of vertexes
int m; // amount of edges
stack<int> stk; // record the Euler circle
void dfs(int x){
stk.push(x);
for(int i=head[x];i!=-1;i=edge[i].nxt){
if(!edge[i].vis && !edge[i^1].vis){
edge[i].vis=true;
dfs(edge[i].to);
return;
}
}
}
void Fluery(int src) {
stk.push(src);
while(!stk.empty()){
int u=stk.top();
int flag=false;
for(int i=head[u];i!=-1;i=edge[i].nxt)
if(!edge[i].vis && !edge[i^1].vis){
flag=true;
break;
}
if(!flag){
printf("%d ",stk.top());
stk.pop();
}
else{
stk.pop();
dfs(u);
}
}
}
int main(){
scanf("%d%d", &n,&m);
init_edge(n);
for(int i=1;i<=m;i++){
int u,v; scanf("%d%d", &u,&v);
add_edge(u,v);
deg[u]++;
deg[v]++;
}
int num=0,src=1;
for(int i=1;i<=n;i++)
if(deg[i]&1) src=i;
if(num==0||num==2)
Fluery(src);
return 0;
}