對於給定的圖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);
}
}
}