Fleury算法

算法: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;
}

參考資料:https://www.cnblogs.com/zdblog/articles/3725858.html

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容