Fleury(佛羅萊)算法求歐拉回路的學習


歐拉回路:簡單來說,就是經過圖G的每條邊一次且僅一次,回到出發點的路徑就叫歐拉回路;

我就直接上模板了。。。。

View Code
 1 #include<iostream>
 2 #include<stack>
 3 const int MAXN=111;
 4 using namespace std;
 5 
 6 stack<int>S;
 7 int edge[MAXN][MAXN];
 8 int n,m;
 9 
10 void dfs(int x){
11     S.push(x);
12     for(int i=1;i<=n;i++){
13         if(edge[x][i]>0){
14             edge[i][x]=edge[x][i]=0;//刪除此邊
15             dfs(i);
16             break;
17         }
18     }
19 }
20 
21 //Fleury算法的實現
22 void Fleury(int x){
23     S.push(x);
24     while(!S.empty()){
25         int b=0;
26         for(int i=1;i<=n;i++){
27             if(edge[S.top()][i]>0){
28                 b=1;
29                 break;
30             }
31         }
32         if(b==0){
33             printf("%d",S.top());
34             S.pop();
35         }else {
36             int y=S.top();
37             S.pop();
38             dfs(y);//如果有,就dfs
39         }
40     }
41     printf("\n");
42 }
43 
44 int main(){
45     scanf("%d%d",&n,&m); //讀入頂點數以及邊數
46     memset(edge,0,sizeof(edge));
47     int x,y;
48     for(int i=1;i<=m;i++){
49         scanf("%d%d",&x,&y);
50         edge[x][y]=edge[y][x]=1;
51     }
52     //如果存在奇數頂點,則從奇數頂點出發,否則從頂點0出發
53     int num=0,start=1;
54     for(int i=1;i<=n;i++){                        //判斷是否存在歐拉回路
55         int degree=0;
56         for(int j=1;j<=n;j++){
57             degree+=edge[i][j];
58         }
59         if(degree&1){
60             start=i,num++;
61         }
62     }
63     if(num==0||num==2){
64         Fleury(start);
65     }else
66         printf("No Euler Path\n");
67     return 0;
68 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM