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

  • 相关阅读:
    NOI2005 维护数列(splay)
    傻子代码行列式
    Matrix-tree定理 spoj HIGH
    Boruvka算法求最小生成树
    Codeforces 521 E cycling city
    欧拉回路 uoj117
    BZOJ1146: [CTSC2008]网络管理Network
    我的OI生涯番外篇
    主席树+dfs SPOJ BZOJ2588 Count on a tree
    动态主席树 优化版
  • 原文地址:https://www.cnblogs.com/markliu/p/2613253.html
Copyright © 2011-2022 走看看