歐拉回路

對於給定的圖G,如果從某個結點出發走一條道路,使得它恰好通過G的每一條邊恰好一次,該路徑成爲歐拉道路。如果該路徑起點終點相同,那麼成爲歐拉回路(可見,歐拉回路是特殊的歐拉道路)。這也是一筆畫問題。

不同的圖,歐拉道路和迴路的判斷條件也不同,當然圖都必須是連通圖。如果是有向圖,存在歐拉道路的條件是沒有或者只有兩個入度不等於出度的點,並且必須是一個點的出度比入度大一(歐拉道路的起點),一個點的入度比出度大一(歐拉道路的終點);如果所有的點入度等於出度,就是歐拉回路了。 而對於無向圖,存在歐拉道路的條件是沒有或者只有兩個奇點,並且必須從一個奇點出發,另一個奇點結束;如果所有點度數均爲偶數,則爲歐拉回路。

當確定之後,需要打印出歐拉道路,可利用dfs搜索將走過的邊壓棧。

//適用於無向圖
void euler(int u)
{
    for(int v=1; v<=n; v++)
    {
        if(G[u][v])
        {
            G[u][v]--;
            G[v][u]--;//如果是有向圖,該句去掉
            euler(v);
            //壓棧
            Edge tmp;
            tmp.u = u;
            tmp.v = v;
            Stack.push(tmp);
        }
    }
}

 

發佈了43 篇原創文章 · 獲贊 8 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章