zoukankan      html  css  js  c++  java
  • Fleury 求欧拉回路

    思想就是有别的选择就不走桥。

    加一个dfs.

    看代码自行理解,我也没理解完全。

    欧拉回路或欧拉通路的判别定理:度为奇数的顶点数目为2或0,为2有欧拉通路,起点和终点就是度为奇数的点,为0有欧拉回路,起点任意。

    View Code
     1 #include <cstdio>
     2 #include <cstring>
     3 #define MAXN 100
     4 bool edge[MAXN][MAXN];
     5 int n;
     6 int mystack[MAXN];
     7 int top;
     8 void dfs(int x)
     9 {
    10     int i;
    11     mystack[top++] = x;
    12     for(i = 1; i<= n; i++)
    13     {
    14         if(edge[i][x])
    15         {
    16             edge[i][x] = false;
    17             edge[x][i] = false;
    18             dfs(i);
    19             break;
    20         }
    21     }
    22 }
    23 void Fleury(int x)
    24 {
    25     top = 0;
    26     int i;
    27     mystack[top++] = x;
    28     while(top > 0)
    29     {
    30         bool flag = false;
    31         top--;
    32         for(i=1; i<=n; i++)
    33         {
    34             if(edge[i][mystack[top]])
    35             {
    36                 flag = true;
    37                 break;
    38             }
    39         }
    40         if(flag)
    41         {
    42             dfs(mystack[top]);
    43         }
    44         else
    45         {
    46             printf("%d ",mystack[top]);
    47         }
    48     }
    49 }
    50 int main()
    51 {
    52     freopen("in.cpp","r",stdin);
    53     int i,j;
    54     int m;
    55     scanf("%d%d",&n,&m);
    56     memset(edge,0,sizeof(edge));
    57     for(i=0; i<m; i++)
    58     {
    59         int u,v;
    60         scanf("%d%d",&u,&v);
    61         edge[v][u] = edge[u][v]  = true;
    62     }
    63     int num = 0;
    64     int start = 1;
    65     for(i =1; i<=n; i++)
    66     {
    67         int degree = 0;
    68         for(j=1; j<=n; j++)
    69             degree += edge[i][j];
    70         if(degree&1)
    71         {
    72             start = i;
    73             num++;
    74         }
    75     }
    76     if(num == 0 || num == 2)
    77         Fleury(start);
    78     else
    79         printf("No Euler path\n");
    80     return 0;
    81 }
  • 相关阅读:
    算法题(2):两个数组的交集
    git 的一些小 tips
    linux 命令 -- chmod
    linux 命令 -- alias 和 grep
    docker 学习笔记(2)
    docker 学习笔记(1)
    redis 学习笔记(2)
    redis 学习笔记(1)
    对对象的list集合以excel表格导出
    字符串处理
  • 原文地址:https://www.cnblogs.com/allh123/p/2997121.html
Copyright © 2011-2022 走看看