Dijkstra算法(通過邊實現鬆弛)解單源最短路徑問題舉例

題目:
在這裏插入圖片描述
代碼:

#include <stdio.h>

int main()
{
int e[10][10],dis[10],book[10],i,j,n,m,t1,t2,t3,u,v,min;
int inf=9999;//代指無窮大(因爲題目中的點和路徑很少,就解題而言9999就已經足夠大了)
scanf("%d %d",&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++)
{
	scanf("%d %d %d",&t1,&t2,&t3);
	e[t1][t2]=t3;
}

//當不經過任何中間點時,頂點1到各個頂點的距離
for (i=1;i<=n;i++)
{
	dis[i]=e[1][i];
}

//剛開始各個頂點都沒有標記
for (i=1;i<=n;i++)
{
	book[i]=0;
}
book[1]=1;//標記頂點1


//Dijkstra算法核心語句
for (i=1;i<=n-1;i++)//i<=n-1是爲了確保所有的頂點都被標記過,被討論過。這裏只需要循環(n-1)次就夠了
{
	//找到距離1號頂點最近的頂點
	min=inf;

	for (j=1;j<=n;j++)
	{
		if (book[j]==0 && dis[j]<min)
		{
			min=dis[j];
			u=j;
		}
	}

	book[u]=1;//標記該點

	//更新頂點1到頂點v的距離,使得e[1][v]的距離變短
	for (v=1;v<=n;v++)
	{
		if (e[u][v]<inf)//既可避免往回走(例如:e[2][1]=9999),也可確保u和v之間可走(例如:e[2][5]=9999)
		{
			if (dis[v]>dis[u]+e[u][v])
			{
				dis[v]=dis[u]+e[u][v];//更新頂點1到頂點v的距離,使得dis[v]的距離變短
			}
		}	
	}
}

//結果輸出
for (i=1;i<=n;i++)
{
	printf("頂點1到頂點%d的最短距離:%d\n",i,dis[i]);
}
return 0;

}

測試數據及運行結果:
在這裏插入圖片描述

發佈了6 篇原創文章 · 獲贊 4 · 訪問量 352
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章