【模板】 歐拉路 歐拉回路

啥是歐拉路(歐拉回路)??

如果給定無孤立結點圖G,若存在一條路,經過圖中每邊一次且僅一次,這條路稱爲歐拉路;
如果給定無孤立結點圖G,若存在一條迴路,經過圖中每邊一次且僅一次,那麼該回路稱爲歐拉回路。
存在歐拉回路的圖,稱爲歐拉圖。

歐拉路(歐拉回路)有啥用??

一筆畫問題 即尋找歐拉路或歐拉回路
裸的模板題 騎馬修柵欄,很裸很裸很裸

歐拉路(歐拉回路)怎麼寫??

如果尋找歐拉回路,對任意一個點進行dfs,尋找歐拉路,則對一個度爲 1 的點進行dfs,時間複雜度爲O(m+n),m爲邊數,n爲點數

#include <bits/stdc++.h>
using namespace std;
int n,m,pic[1100][1100],d[1100],road[1500],now;
void dfs(int x)
{
    for(int i=1;i<=500;i++)
        if(pic[x][i])
        {
            pic[x][i]--;             //注意可能有重邊
            pic[i][x]--;
            dfs(i);
        }
    road[++now]=x;             //記錄路徑
}
int main()
{
    cin>>m;
    for(int i=1;i<=m;i++)
    {
        int x,y;
        cin>>x>>y;
        pic[x][y]++;
        pic[y][x]++;
        d[x]++;
        d[y]++;
    }
    int st=1;                          //如果無度爲1的點,則從任意點開始搜,即尋找歐拉回路
    for(int i=1;i<=500;i++)            //如果有度爲1的點,則從該點開始搜,即尋找歐拉路
        if(d[i]%2)
        {
            st=i;
            break;
        }
    dfs(st);
    for(int i=now;i>=1;i--)
    {
        cout<<road[i]<<endl;
    }
    return 0;
}
發佈了51 篇原創文章 · 獲贊 7 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章