dijkstra演算法
dijkstra演算法算是貪心思想實現的,首先把起點到所有點的距離存下來找個最短的,然後鬆弛一次再找出最短的,所謂的鬆弛操作就是,遍歷一遍看通過剛剛找到的距離最短的點作為中轉站會不會更近,如果更近了就更新距離,這樣把所有的點找遍之後就存下了起點到其他所有點的最短距離。
問題引入:
指定乙個點(源點)到其餘各個頂點的最短路徑,也叫做「單源最短路徑」。例如求下圖中的1號頂點到2、3、4、5、6號頂點的最短路徑。
下面我們來模擬一下:
//鄰接矩陣是用列模擬每乙個點,每一行來表示每一列表示的點到每個點的距離2//
如果能走到則距離為具體數字若不能走到則為無窮大即0x3f3f3f3f 3//
樸素dijkstra演算法實質找到每個點到每個點的最短距離中的最小距離4//
並且更新d,更新1號點到其他點的距離 5//
再從這個最短距離的點去尋找其能尋找到的最短的距離
6 #include7 #include8 #include9
using
namespace
std;
10const
int n=505;11
intn,m;
12int q[n][n],d[n];//
q儲存稠密圖的鄰接矩陣d儲存1到每個點的最小距離
13bool st[n];//
標記每個數是否被找到最短距離
14int
dijkstra()
1525 st[t]=true;26
for(int j=1;j<=n;j++)
27 d[j]=min(d[j],d[t]+q[t][j]);//鬆弛操作
28//
此處為即為1->t->j 更新1到j的最短距離就用1到t的距離加上t到j的距離 29}
30if(d[n]!=0x3f3f3f3f) return
d[n];
31else
return -1
; 32}33
intmain()
3444 cout
45return0;
46 }
樸素版的dijkstra演算法
去你大爺的dijkstra演算法 沒忍住,學了好久終於解決了樸素版的dijkstra演算法 水題鏈結 最短路徑問題 include include include using namespace std int n,m const int n 510 int dis n 某點到n的距離 int g ...
Dijkstra演算法求最短路 樸素版
圖論中求最短路的演算法有很多,這裡使用一道模板題來介紹可以求單源最短路的dijkstra演算法 acwing 849.dijkstra求最短路 i 求乙個源點到 除了這個點之外其他所有的點 的最短距離,不需要記錄每條路徑 這題一直困惑著我的是,為什麼一開始找的最小的最短距離就是確定的最短距離?想了好...
Dijkstra求最短路 I(樸素演算法)
給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,所有邊權均為正值。請你求出1號點到n號點的最短距離,如果無法從1號點走到n號點,則輸出 1。輸入格式 第一行包含整數n和m。接下來m行每行包含三個整數x,y,z,表示存在一條從點x到點y的有向邊,邊長為z。輸出格式 輸出乙個整數,表示1號點到n號...