部落格食用更佳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調優主要是記憶體管...