我覺得這個例子很難體現,所以自己想了個例子:
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則任意指定...