图论--Dijkstra算法总结
Key word:
①BFS轉換Dijkstra
②其他關系轉化為最短路
③反向建邊及反向Dijkstra
④稠密圖、稀疏圖
⑤鏈式前向星
⑥Vector建圖
⑦超級源點&匯點
詳解:
1.BFS轉換Dijkstra: 對于一些路徑的的問題及一些特殊的搜索題目,如果數據量很多但是處理邊的復雜程度可以接受,就是說我們可以通過操作將原來要搜索的問題轉化為Dijkstra能做的問題,這樣可以提高效率,雖然介于BFS與Dijkstra之間有著A*,但是A*的題目我目前就看到了一類,第K短路,常用的還是轉換。舉個例子:在一個城堡中,有機關陷阱并且告知了其坐標,設城堡為一個二維平面,若這個二維有10000點,BFS最壞的情況是O(V^2)那么可能會超時,那么我們考慮,將每個點的作為節點建圖,若有機關則他與上下左右都不連通,其他的每個點建立四聯通邊,那么時間復雜度為O(4*V),再加上Dijkstra為O(4*V+VlogV)可以將其解出,這個例子可能不太恰當,但是在這里給出解題的思想,BFS與Dijkstra同是單源最短路是可以轉化的。
2.其他關系轉化為最短路:
我們這里以POJ 1062 昂貴的禮物作為例子
年輕的探險家來到了一個印第安部落里。在那里他和酋長的女兒相愛了,于是便向酋長去求親。酋長要他用10000個金幣作為聘禮才答應把女兒嫁給他。探險家拿不出這么多金幣,便請求酋長降低要求。酋長說:"嗯,如果你能夠替我弄到大祭司的皮襖,我可以只要8000金幣。如果你能夠弄來他的水晶球,那么只要5000金幣就行了。"探險家就跑到大祭司那里,向他要求皮襖或水晶球,大祭司要他用金幣來換,或者替他弄來其他的東西,他可以降低價格。探險家于是又跑到其他地方,其他人也提出了類似的要求,或者直接用金幣換,或者找到其他東西就可以降低價格。不過探險家沒必要用多樣東西去換一樣東西,因為不會得到更低的價格。探險家現在很需要你的幫忙,讓他用最少的金幣娶到自己的心上人。另外他要告訴你的是,在這個部落里,等級觀念十分森嚴。地位差距超過一定限制的兩個人之間不會進行任何形式的直接接觸,包括交易。他是一個外來人,所以可以不受這些限制。但是如果他和某個地位較低的人進行了交易,地位較高的的人不會再和他交易,他們認為這樣等于是間接接觸,反過來也一樣。因此你需要在考慮所有的情況以后給他提供一個最好的方案。?為了方便起見,我們把所有的物品從1開始進行編號,酋長的允諾也看作一個物品,并且編號總是1。每個物品都有對應的價格P,主人的地位等級L,以及一系列的替代品Ti和該替代品所對應的"優惠"Vi。如果兩人地位等級差距超過了M,就不能"間接交易"。你必須根據這些數據來計算出探險家最少需要多少金幣才能娶到酋長的女兒。?
對于這個題目,我們考慮每個人是一個節點,他們需要的東西是單向邊,那么我們可以建立起一張有向圖,可以使用最短路進行計算,類似上次Floyd那個匯率問題這里也可以這么做,所以看到這個題,那么首先要想到最短路去解決才可以。類似的還有很多的題目可以轉化為最短路,這個就要自己去理解體會。
3.反向建邊及反向Dijkstra與超級源點與超級匯點:https://blog.csdn.net/weixin_43627118/article/details/100134565?
補充:對于反向建邊,及反向Dijkstra的應用,比如N個人去編號為X的人家去吃飯,但是N個人所在的城市比較特殊有很多單行線,所以他們來的路可能不是他們回去的路,求他們的來去的走的路程的總和的最小值。這個題走的時候是最短路的距離和來的時候不能去做N遍最短路,那么我們反向建邊反向使用Dijkstra,這樣最短即是N個點到X的距離最小值。
4.稠密圖&稀疏圖
稠密圖是E邊數接近V^2的圖,稀疏圖接近0(不太恰當,就是邊較少),對于稠密圖樸素Dijkstra O(V^2)而優化算法為(E+VlogV),邊數E接近V^2,所以使用樸素DIjkstra算法。
5.鏈式前向星:一種關于稀疏圖的建圖方式:https://blog.csdn.net/weixin_43627118/article/details/99612887
6.vector建圖
對于分不太清稠密圖和稀疏圖的時候可以考慮Vector建圖,比直接使用數組模擬稍慢一些,但是有時候用起來還是很不錯的比如有一些點的邊很多用鄰接矩陣存不下,10000個點有一個點跟所有的其他點有邊這就很難搞了,但是用鄰接表訪問沒那么方便,所以可以考慮使用,就用過一次,但是不太推薦使用,主推還是鄰接表。
?
總結
以上是生活随笔為你收集整理的图论--Dijkstra算法总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一加平板真机亮相:配备磁吸键盘 + 手写
- 下一篇: codeforce 272B Dima