Dijkstra算法 ——通過邊實現鬆弛 最短路徑

今天繼續看《啊哈,算法》,看到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                
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章