歐拉回路,一筆畫問題


本來打算寫證明的,果然還是太菜orz

歐拉回路就是給一個圖,存在一條回路把所邊經過且每條邊只經過一次。

對於無向圖:

  存在歐拉回路的條件:每個點的度都為偶數;

  存在歐拉路的條件:有且只有兩個點的度為一,且這兩個點分別為起點和終點;

對於有向圖:

  存在歐拉回路的條件:每個點出度等於入度;

  存在歐拉路的條件:存在一個點出度比入度多一作為起點,存在一點入度比出度多一作為終點,其余點出度等於入度;

求歐拉回路的方法——基本(套圓)法

  dfs搜索,不能再往下走便回溯,回溯時記錄路徑,回溯時不清除對邊的標記,最后求出來的路徑就是歐拉回路。

 

 

 

 

 

(1)走<1,2>,<2,3>,<3,4>,<4,5>,<5,1>,然后無路可走,就回溯記錄下回溯路徑<1,5>,<5,4>,4點有其它路殼走。

(2)<4,8>,<8,3>,<3,6>,<6,7>,<7,2>,<2,4>,無路可走,然后回溯<1,5>,<5,4>,<4,2>,<2,7>,<7,6>,<6,3>,<3,8>,<8,4>,<4,3>,<3,2>,<2,1>。

記錄下的路徑<1,5>,<5,4>,<4,2>,<2,7>,<7,6>,<6,3>,<3,8>,<8,4>,<4,3>,<3,2>,<2,1>便是一條歐拉回路。

#include <iostream>
#include <vector>
using namespace std;
vector <int > aa[155];
int bb[155][155],ee[155];
vector <int > cc;
int dd[11][2]={
{1,2},{1,5},{2,4},{2,3},{2,7},{4,5},{4,8},{4,3},{8,3},{3,6},{6,7}};
void bfs (int t)
{
    for (vector <int > ::iterator i=aa[t].begin();i!=aa[t].end();i++)
    {
        if (!bb[*i][t]) continue;
        bb[*i][t]=0;
        bb[t][*i]=0;
        bfs (*i);
    }
    cc.push_back(t);
}
int main ()
{
    int n=8,m=11;
    for (int i=0;i<n;i++)
    {
        aa[i].clear();
        ee[i]=0;
    }
    for (int i=0;i<m;i++)
    {
        aa[dd[i][0]].push_back(dd[i][1]);
        aa[dd[i][1]].push_back(dd[i][0]);
        bb[dd[i][1]][dd[i][0]]=1;
        bb[dd[i][0]][dd[i][1]]=1;
    }
    bfs(1);
    for (vector <int >::iterator i=cc.begin();i!=cc.end();i++)
        cout <<*i<<" ";
    cout <<endl;
}
View Code

運行結果:

。。。。。。。。

 


免責聲明!

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



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