uva 12118 尤拉路徑dfs

2021-10-06 00:17:31 字數 1204 閱讀 8957

我覺得這個例子很難體現,所以自己想了個例子:

v e t 分別為 8 7 1

如上圖先只看上面5個點 從0-4

我們需要走 0-1 0-3 0-2 0-4 這幾條路(從哪一方向都可以走)(也可以重複遍歷,因為沒說,但我們不選擇這麼做,後面會有原因),因為要求經過這四條邊最短的遍歷過程,我們只需要做一條一筆畫,保證這四個邊在一筆畫裡就可以實現最短。

先看看我們可以怎麼走 0-2-1-0-3-4-0 或者 0-2-0-1-0-3-0-4 不難發現我們前者構造了一條尤拉路徑。

我們轉變問題:在現有邊的基礎上加上幾條邊就可以做成一筆畫?

我們可以統計0-4這些點的奇度頂點個數:4個 只要加一條邊就會少2個奇度頂點,但由於尤拉圖的性質:我們可以有且僅有2個奇度頂點作為起始點和終止點,3-0-1-2-0-4 這就是最優方案。我們只加了一條1-2邊

按照上面過程,0-4結點處理完畢

處理5-8

同樣四個奇度頂點(這奇度頂點個數一定是偶數個,也是性質哦)我們構造尤拉路徑,新增6-7,5作起始點,8做終止點

連線4(上圖終止點)和下圖的5(下圖起始點)就解決了乙個完整一筆畫問題;

總結:求連通分支數量-1 和每個連通分量構成尤拉路徑《加邊的個數》 就是構成一筆畫需要的總加邊數,此題*t 每邊有個構造值,就結束了。

#include

#include

#include

const

int maxn =

1000+10

;using

namespace std;

vector<

int>g[maxn]

;int vis[maxn]

;int n;

intdfs

(int x)

}return cnt;

}int

main()

int ans=0;

for(

int i=

1;i<=v;i++)}

if(ans>

0)ans--

;printf

("case %d: %d\n"

,ts++

,t*(e+ans));

}return0;

}

sgu 101 Domino 尤拉路徑 DFS

include include int n,e 11 11 num 11 t 0,flag struct nodec 101 d 101 void dfs int u,int num for int i 0 i 6 i if e u i 0 int main else if c i x d j y ...

尤拉路徑 尤拉迴路

尤拉迴路 連通圖,一條路徑恰好經過所有邊一次,並且構成迴路 起點終點相同 尤拉路徑 連通圖,一條路徑恰好經過所有邊一次 起點終點不必相同 具有尤拉迴路的圖稱尤拉圖,具有尤拉路徑但不具有尤拉迴路的圖稱半尤拉圖 無向圖尤拉迴路的判斷 連通圖,所有頂點度數均為偶數 無向圖尤拉路徑的判斷 連通圖,只有兩頂點...

尤拉迴路 尤拉路徑

尤拉路徑 如果圖 g 種的一條路徑包括所有的邊,且僅通過一次的路徑.尤拉迴路 能回到起點的尤拉路徑.混合圖 既有無向邊又有無向邊的圖.hierholzer演算法自動尋找尤拉迴路,在找不到尤拉迴路的情況下會找到尤拉路徑。前提是得給它指定好起點。演算法流程 無向圖 1.判斷奇點數。奇點數若為0則任意指定...