zoukankan      html  css  js  c++  java
  • Fleury算法

    欧拉回路放了好久,一直以来就认为他就是判定+dfs,但总有个Fleury压在心头,今天仔细一看,不就是dfs吗?还弄个人名做外套。

    Fleury算法:

    1.判定该图是否为Euler图,包括有向欧拉通路,有向欧拉回路,无向欧拉通路,无向欧拉回路:

    有向欧拉通路:起点:出度-入度=1,终点:入度-出度=1,其它点:入度==出度

    有向欧拉回路:所有点:入度==出度

    无向欧拉通路:仅有两个奇度点

    无向欧拉回路:无奇度点

    2.选择起点

    3.采用dfs寻找Euler路径。

    附无向图欧拉通路(num==2)、欧拉回路(num==0)Fleury模板:

    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #define MAXN 200
    using namespace std;
    struct stack{
        int top,node[MAXN];
    }s;
    int Edge[MAXN][MAXN];
    int n;
    void dfs(int x){
        int i;
        s.top++;
        s.node[s.top]=x;
        for(i=0;i<n;i++){
            if(Edge[i][x]>0){
                Edge[i][x]=0;
                Edge[x][i]=0;
                dfs(i);
                break;
            }
        }
    }
    void Fleury(int x){
        int i,b;
        s.top=0;s.node[s.top]=x;
        while(s.top>=0){
            b=0;
            for(i=0;i<n;i++){
                if(Edge[s.node[s.top]][i]>0){
                    b=1;break;
                }
            }
            if(b==0){
                printf("%d ",s.node[s.top]+1);
                s.top--;
            }
            else{
                s.top--;
                dfs(s.node[s.top+1]);
            }
        }
        printf("\n");
    }
    int main()
    {
        freopen("in.txt","r",stdin);
        int i,j;
        int m,s,t;
        int degree,num,start;
        while(scanf("%d%d",&n,&m)!=EOF){
            memset(Edge,0,sizeof(Edge));
            for(i=0;i<m;i++){
                scanf("%d%d",&s,&t);
                Edge[s-1][t-1]=1;
                Edge[t-1][s-1]=1;
            }
            num=0;start=0;
            for(i=0;i<n;i++){
                degree=0;
                for(j=0;j<n;j++)
                    degree+=Edge[i][j];
                if(degree%2==1){
                    start=i;
                    num++;
                }
            }
            if(num==0 || num==2) Fleury(start);
            else printf("No Euler path\n");
        }
        return 0;
    }

    Input:

    9 14
    1 2
    1 8
    2 3
    2 8
    2 9
    3 4
    4 5
    4 6
    4 9
    5 6
    6 7
    6 9
    7 8
    8 9

    Output:

    1 8 9 6 7 8 2 9 4 6 5 4 3 2 1

  • 相关阅读:
    mysql复制那点事
    全排列问题
    56. Merge Interval
    2. Add Two Numbers
    20. Valid Parentheses
    121. Best Time to Buy and Sell Stock
    120. Triangle
    96. Unique Binary Search Trees
    91. Decode Ways
    72. Edit Distance
  • 原文地址:https://www.cnblogs.com/markliu/p/2613253.html
Copyright © 2011-2022 走看看