尤拉迴路基本概念 判斷 求解

2022-09-19 03:39:10 字數 3180 閱讀 2261

如果圖\(g\)(有向圖或者無向圖)中所有邊一次僅且一次行遍所有頂點的通路稱作尤拉通路。

如果圖\(g\)中所有邊一次僅且一次行遍所有頂點的迴路稱作尤拉迴路。

具有尤拉迴路的圖成為尤拉圖(簡稱\(e\)圖)。具有尤拉通路但不具有尤拉迴路的圖成為半尤拉圖。

頂點可以經過多次

畫個圖分辨一下:

簡單來講就是尤拉迴路能夠回到起點

尤拉通路和尤拉迴路的判定是很簡單的

無向圖\(g\)存在尤拉通路的充要條件是:

\(g\)為連通圖,並且\(g\)僅有兩個奇度節點(度數為奇數的頂點)或者無奇度節點

推論1:

當\(g\)是僅有兩個奇度節點的連通圖時,\(g\)的尤拉通路必以此兩個節點為端點

當\(g\)是無奇度節點的連通圖時,\(g\)必有尤拉迴路

\(g\)為尤拉圖(存在尤拉迴路)的充分必要條件是\(g\)為無奇度節點的連通圖

有向圖\(d\)存在尤拉通路的充要條件是:

\(d\)為有向圖,\(d\)的基圖聯通,並且所有頂點的出度與入度都相等;或者除兩個頂點外,其餘頂點的出度與入度都相等,而在這兩個頂點中乙個頂點的出度與入度只差為\(1\),另乙個頂點的出度與入度之差為\(-1\)

推論2:

當\(d\)除出、入度之差為\(1\),\(-1\)的兩個頂點之外,其餘頂點的出度與入度都相等時,\(d\)的有向尤拉通路必以出、入度之差為\(1\)的頂點作為始點,以出、入度之差為\(-1\)的頂點作為終點

當\(d\)的所有頂點的出、入度都相等時,\(d\)中存在有向尤拉迴路

有向圖\(d\)為有向尤拉圖的充分必要條件是\(d\)的基圖為連通圖,並且所有的頂點的出、入度都相等

根據定理和推論,我們可以很好的找到尤拉通路迴路的判斷方法

a.判斷尤拉通路是否存在的方法

b.判斷尤拉迴路是否存在的方法哥尼斯堡七橋問題

一筆畫問題

旋轉鼓輪的設計

\(dfs\)

鄰接矩陣的時間複雜度為\(o(n^2)\)

鄰接表的時間複雜度為\(o(n+e)\)

如果,重邊太多的話,鄰接表會掛掉:)

原題卡這個,所以我們要寫鄰接矩陣

const int n=1005;

int n,m;

int in[n];

bool vis[n],g[n][n];

void dfs(int x)

}}int main()

dfs(1);

bool flag=1;

for(int i=1;i<=n;i++)

if(in[i]%2)

}if(flag)puts("1");

else puts("0");}}

並查集
const int n=1005;

int n,m;

int in[n],fa[n];

int find(int x)

void union_set(int x,int y)

int main()

for(int i=1,x,y;i<=m;i++)

bool flag=1;int totrt=0;

for(int i=1;i<=n;i++)

if(find(i)==i)

}//只有乙個根且沒有入度為奇數的點

if(flag&&totrt==1)puts("1");

else puts("0");

}return 0;

}

板子題:騎馬修柵欄

題目保證有解。

a.dfs搜尋求解尤拉迴路

基本思路:利用尤拉定理判斷出乙個圖存在尤拉迴路或尤拉通路後,選擇乙個正確的起始頂點,用dfs演算法遍歷所有的邊(每條邊只遍歷一次),遇到走不通就回退。在搜尋前進方向上將遍歷過的邊按順序記錄下來。這組邊的排列就組成了一條尤拉通路或迴路。

const int n=2005;

int m,min,max;

int g[n][n],in[n];

int path[n],cnt;

void dfs(int x)

}path[++cnt]=x;

}void print_path()

}int main()

for(int i=min;i<=max;i++)

}//尤拉通路

dfs(min);//尤拉迴路

print_path();

return 0;

}

b.fleury(佛羅萊)演算法

求法:​ 設\(g\)為一無向尤拉圖,求\(g\)中一條尤拉迴路的演算法為:

任取\(g\)中一頂點\(v_0\),令\(p_0=v_0\)

假設沿\(p_i= v_0e_1v_1e_2...e_iv_i\)走到頂點\(v_i\),按下面方法從\(e(g)-中選\)

\(e_\)

\(e_\)與\(v_i\)相關聯

除法無別的邊可供選擇,否則\(e_\)不應該是\(g_i=g-\)中的橋

當2.無法進行時演算法停止

可以證明的是,當演算法停止時,所得到的簡單迴路\(p_m= v_0e_1v_1e_2...e_mv_m\)為\(g\)中一條尤拉迴路

我個人感覺是把大連通塊分成了零散的幾個小連通塊然後分塊連線(?)

關鍵是能不走橋就不走橋,實在無路可走了才會去走橋

const int n=2005;

int n,m;

int top,sta[n];

bool g[n][n];

void dfs(int x)

}}void euler(int x)

}if(!brige)

else

}}int main()

int num=0,start=1;

for(int i=1;i<=n;i++)

}

if(num==0||num==2)euler(start);

else

return 0;

}

to be continue……

尤拉迴路求解

先判斷能不能形成尤拉迴路 如果能那就輸出尤拉迴路路徑 zoj 2238 poj 1780 code 輸出乙個數字序列 使得n位的十進位制數都在裡面 遞迴的方法求解 include include include include include include include define eps 1...

判斷尤拉迴路

算卦先生來問你,對於每個他給出的無向圖,是否存在一條路徑能夠經過所有邊恰好一次,並且經過所有點?不需要滿足最後回到起點。第一行乙個數 t,表示有 t組資料。對與每組資料,第一行有兩個數 n,m,接下去 m行每行兩個數 u,v描述一條無向邊 u,v 圖不保證聯通。對於每組資料,如果存在,輸出 zhen...

HDU 1878 尤拉迴路(判斷尤拉迴路)

題目大意 尤拉迴路是指不令筆離開紙面,可畫過圖中每條邊僅一次,且可以回到起點的一條迴路。現給定乙個圖,問是否存在尤拉迴路?解題思路 判斷無向圖是否存在尤拉迴路,判斷每個點的度數是否為偶數 並查集確認連通性。1 include2 include3 include4 define clr arr,val...