今天繼續看《啊哈,算法》,看到Dijkstra算法 之前的Floyd-Warshall算法感覺還好理解,這個就一臉懵,然後就去嗶哩嗶哩上先看了下大概思想
鏈接:
https://www.bilibili.com/video/BV1Ut41197ae?from=search&seid=18175380048179540599
dis表中存放了所有的頂點,初始值對應各個頂點第一個頂點離最近的點距離填入,其餘的點默認爲無窮
算法就是首先找dis表中最近距離的,找到這個頂點(設置爲i)後,並且設置i頂點爲訪問過。進入表格找到對應行,那一行會有頂點i對應所有頂點的距離,找出有距離且不爲無窮距離的點來進行比對,也就是dis[j]>dis[i]+e[i][j] ,如果有大於的話說明找到最短的一條路徑
dis[j] 就是1->j點的最短距離 (1->i這裏是1到i點的距離)
dis[i] 就是1->i的最短距離
e[i][j] 就是i->j的距離
若是i->j的距離加上1->i的距離大於dis[j]中的距離就進行更新dis表中的數據
輸入條件:
6 9
1 2 1
1 3 12
2 3 9
2 4 3
3 5 5
4 3 4
4 5 13
4 6 15
5 6 4
代碼:
#include <stdio.h>
int main()
{
int e[51][51],t1,t2,t3,dis[10],book[10],i,j,min,n,m,u,v;
int inf = 99999999;
scanf("%d%d",&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++){
scanf("%d%d%d",&t1,&t2,&t3);
e[t1][t2]=t3;
}
//初始化dis數組,這裏是1號頂點到其餘頂點到其餘各個頂點的初始路程
for(i=1;i<=n;i++)
dis[i]=e[1][i];
for(i=1;i<=n;i++)
book[i]=0;
book[1]=1;
//Dijkstra算法
for(i=1;i<=n-1;i++) //找n-1次
{
//找到離1號頂點最近的頂點
min=inf;
for(j=1;j<=n;j++)
{
if(book[j]==0&&dis[j]<min){
min=dis[j];
u=j; //這裏u代表着dis中沒有到達的最近的頂點
}
}
book[u]=1; //給此時已經找到的頂點做個標記
for(v=1;v<=n;v++){ //從表中查詢從u這個頂點到各個位置的距離
if(e[u][v]<inf){ //如果與其距離不是爲無窮
if(dis[v]>dis[u]+e[u][v]) //那麼進行比較從表格中到那個點數據加上dis表中數據
dis[v]=dis[u]+e[u][v];
}
}
}
for(i=1;i<=n;i++)
printf("%d ",dis[i]);
return 0;
}
運行結果:0 1 8 4 13 17
可以加羣一起討論交流:891507813