Dijkstra以及heap優化詳解

2022-08-22 14:15:11 字數 1843 閱讀 8997

部落格食用更佳bossbaby's blog

迪傑斯特拉演算法是由荷蘭計算機科學家狄克斯特拉於1959 年提出的,因此又叫狄克斯特拉演算法。是從乙個頂點到其餘各頂點的最短路徑演算法,解決的是有向圖中最短路徑問題。迪傑斯特拉演算法主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。

迪傑斯特拉演算法的要求是不能存在負權邊(而\(spfa\)可以),可存在環(而\(spfa\)則不行)

迪傑斯特拉會從出發點開始列舉每個可到達的點,用這個點去鬆弛這個點未到達過的可到達的點

我們會先列舉離出發點最近(可能是更新後的),也是\(dis\)值最小,且未訪問過的乙個節點.然後,進行鬆弛他的所有可以連線的節點.最後所有點的\(dis\)值就是他到\(start\)(原點)的最短距離.

假設現在正在搜尋\(u\),有乙個訪問過的節點\(v\)可以連通到\(u\).首先,\(dis[v]\)是可能會大於\(dis[u]\)的,應為第一次搜尋進入\(v\)的邊的權值可能非常大.所以再更新一遍比較穩妥.

感性理解一下就會發現不行

這樣就會改變應有的搜尋順序,使得一些本應該先放問的點後面再訪問,而一些次優點被先訪問.

這個演算法其實有貪心的成分在裡面,因為是最短,所以每次都從最短的開始搜尋.

而負權邊會使得路徑一直減小.

鄰接矩陣

#include#define maxn 100000

using namespace std;

int d[maxn][maxn],dis[maxn];//d為鄰接矩陣,dis為每個點到原點的最小距離,d不連通為inf(=int_max或memset為0x3f)

bool vis[maxn];//vis標記訪問過的節點

int n;//點個數

//省去輸入輸出

void dij(int s/*出發點*/)

}vis[current]=1;//標記已經搜尋過

for(int j=1;j<=n;j++)

}}//完成

//參見上面自行修改...能學dij的應該這個都會吧...
大家想一想,每次都尋找最小的,是不是有點浪費時間,不如每次用堆(\(heap\))維護起來,每次更新乙個點後就把它扔進堆裡面,每次取最上面的.而假如這個點已經又被更新過了一次,就跳過.如何判斷呢?每次把這個點的編號和\(dis\)值扔進去,取出時如果遇見丟進取得\(dis\)與現在的\(dis\)不同,就\(continue\),因為在更新時這個點又被扔進過堆裡了.所以不用擔心漏過.這樣還有乙個好處,就是不用儲存\(vis\),即是否訪問過,所有的都在堆裡面了.

別問我qwq,我也不會,直接用\(stl\)的\(priority\_queue\)

既然沒有什麼問題,就上**了.

//使用的是c++11

//複雜度 o(nlogn)

//比較與spfa o(m/*邊*/)

//更適合稠密圖

#include#define inf llong_max

using namespace std;

using pii=pair;

using ll=long long;

int n;

ll d[1010][1010];

ll dis[1010];

int cnt[1010];//每個點連線的邊的個數

pii e[1010][1010];//鄰接表

int dij(int s/*出發點*/)

dij(1);//dij搜尋

return 0;

}

重申一邊,不能在有負權邊的圖里用!!!有負權邊請用\(spfa\)!!!有負權邊和環就兩個都不能用了qwq

模板 最短路徑(Dijkstra 4heap)

基本介紹 模板題目 實現 終於來發堆優化的迪傑斯特拉了 普通的迪傑斯特拉複雜度是o n 2 的 感覺對於資料大的題和弗洛伊德沒什麼兩樣吧 但是堆優化後能到o m n log n 還比較不錯 但不能去搞圖中有負邊權的情況 我的 採用了大佬zheng.ht的模板 用c 的stl優先佇列實現 不知道為什麼...

mysql搭建以及調優

搭建 調優 windows安裝mysql 1 以管理員身份執行cmd 2 安裝 3 client does not support authentication protocal rquested by server use mysql alter user root localhost ident...

JVM引數以及調優

二 在大型系統中配置jvm引數 你要在j2ee環境中配置這些引數,那麼你需要在j2ee應用伺服器或者servlet容器相關啟動引數設定處指定,其啟動檔案中來配置,tomcat是在catalina.bat中配置,weblogic和websphere是在其他地方 三 jvm調優 jvm調優主要是記憶體管...