如果圖\(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...