1. 程式人生 > >筆記:最短路徑算法—Dijkstra(迪傑斯特拉)

筆記:最短路徑算法—Dijkstra(迪傑斯特拉)

意思 最終 else min out 拓展 clas stream 便是

技術分享圖片

文中代碼下如下:

#include<iostream>
#include<cstdio>
#include<fstream>
#include<algorithm>
#include<string>
#include<sstream>
#include<cstring>
    using namespace std;    
int e[10][10],dis[10],book[10];
int main()
{
    int i,j,n,m,t1,t2,t3,u,v,min;
    int inf=99999999
; //用inf(infinity的縮寫)存儲一個我們認為的正無窮值 cin>>n>>m; //讀入n和m,n表示頂點個數,m表示邊的條數 //初始化 for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(i==j) e[i][j]=0; else e[i][j]=inf;
//讀入邊 for(i=1;i<=m;i++) { cin>>t1>>t2>>t3;//t1 t2是頂點,t3是邊 e[t1][t2]=t3; //給t1 t2之間的距離 賦值t3 } //初始化dis數組,這裏是1號頂點到其余各個頂點的初始路程 for(i=1;i<=n;i++) dis[i]=e[1][i]; //book數組初始化 for(i=1;i<=n;i++) book[i]=0; //設所有最短路的頂點未知的
book[1]=1; //設置源點1是已知的頂點 //Dijkstra算法核心語句 for(i=1;i<=n-1;i++) { //找到離1號頂點最近的頂點(貪心法?) min=inf; for(j=1;j<=n;j++) { if(book[j]==0 && dis[j]<min)//因為book[1]=1已被設置為源頂點=1,所以這條語句 { // 實際上是找未知道頂點中離源頂點book[1]直接距離最近的頂點 min=dis[j];//更新最近的頂點 u=j; //最後把這個找到的最近頂點賦值給u,因為後面的book[u]要標記一下。 } } book[u]=1;//更新為離源頂點1最近的已知頂點 如果有優先隊列優化 ,這裏便是出隊(最近的頂點) for(v=1;v<=n;v++)//松馳操作(BFS?拓展?) { if(e[u][v]<inf) { if(dis[v]>dis[u]+e[u][v])//dis[u]是的意思是源點1->u最近的距離,e[u][v]表示u頂點到v頂點的距離 //dis[u]+e[u][v]的意思就是1->u->v 的距離 dis[v]=dis[u]+e[u][v];//更新1->v的距離(包括直接或間接距離) } } } //輸出最終的結果 for(i=1;i<=n;i++) cout<<dis[i]<<" ";//輸出1號頂點到所有點的最短路 return 0; }

筆記:最短路徑算法—Dijkstra(迪傑斯特拉)