当前位置:编程学习 > C/C++ >>

求fleury算法的伪代码 或C语言实现

答案:1#include <stdio.h>
2#include <string.h>
3
4
5struct stack
6{int top , node[210];} f; //顶点的堆栈
7
8int a[201][201]; //图的邻接矩阵
9
10int n;
11
12void dfs(int x)       //图的深度优先遍历
13{
14int i;
15
16f.top ++; f.node[f.top] = x;
17
18for (i = 1; i <= n; i ++)
19
20          if (a[i][x] > 0)
21          {
22              a[i][x] = 0; a[x][i] = 0;     //删除此边
23
24              dfs(i);
25
26              break;
27          }
28}
29
30void Euler(int x)     //欧拉路算法
31{
32int i , b;
33
34f.top = 0; f.node[f.top] = x;     //入栈
35
36while (f.top >= 0)
37{
38          b = 0;
39
40          for (i = 1; i <= n; i ++)
41    if (a[f.node[f.top]][i] > 0)
42    {b = 1; break;}
43
44          if (b == 0)       //如果没有点可以扩展,输出并出栈
45          {
46              printf("%d " , f.node[f.top]);
47
48              f.top --;
49          }
50          else {f.top --; dfs(f.node[f.top+1]);}        //如果有,就DFS
51      }
52}
53
54int main()
55{
56
57int m , s , t , num , i , j , start;
58
59      //input
60
61      scanf("%d %d" , &n , &m); //n顶点数    m边数
62
63      memset(a , 0 , sizeof(a));
64
65      for (i = 0; i < m; i ++)
66      {
67          scanf("%d %d" , &s , &t);
68          a[s][t] = 1; a[t][s] = 1;
69      }
70
71
72      //判断是否存在欧拉回路
73
74      s = 0; start = 1;
75
76      for (i = 1; i <= n; i ++)
77      {
78          num = 0;
79
80          for (j = 1; j <= n; j ++)
81              num += a[i][j];
82
83          if (num % 2 == 1)
84{start = i; s ++;}
85      }
86
87      if ((s == 0) || (s == 2))
88Euler(start);
89      else printf("No Euler path\n");
90
91      getchar(); getchar();
92      return 0;
93}
94

上一个:如何自学C语言?高手进来传授一下学习经验
下一个:哪位大侠帮我写段C语言代码,要求如下

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,