//根據大神模板修改加註釋的我的小菜鳥模板,如有錯誤歡迎指正!
#include <iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
const int N=1005;
const int MAX=0x3f3f3f3f;
int mapa[N][N]; //鄰接矩陣存圖的結構
int flag[N],dis[N]; //flag 標記數組,標記點是否已訪問 //dis記錄固定起點(一般以1爲例)到各點的距離
int dijkstra(int n,int m)
{
for(int i=1;i<=n;i++)
dis[i]=mapa[1][i]; //記錄與1直接相連的點距離1的最短距離
flag[1]=1; //1點已訪問
dis[1]=0; //點1到自身的距離爲0
int k=0; //k初始化爲0,避免題目中出現無法到達時,flag[k]=1無法賦值而出現segmentation core dump
for(int i=1;i<=n;i++){
int min=MAX; //min 記錄最小值
for(int j=1;j<=n;j++)
if(flag[j]==0&&min>dis[j]){ //找未訪問過的點中距離已訪問點的最小值及點k
min=dis[j];
k=j;
}
//或者 if(k)
flag[k]=1; //flag[k]=1 在答案爲no時,k不改變,保留原值,所以一開始初始化k=0
//k!=0:標記k爲已訪問
for(int j=1;j<=n;j++)
if(flag[j]==0&&dis[j]>dis[k]+mapa[k][j]) //引入k點,將dis中與k連通後距離變小的更新
dis[j]=dis[k]+mapa[k][j];
}
return dis[n]; //返回想到達的點的最短距離值
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m)) //n個點 m條路
{
for(int i=0;i<=N-1;i++){
dis[i]=MAX; //dis初始化爲MAX,表示無窮遠,無法連通
flag[i]=0; //標記數組flag初始化爲0
for(int j=0;j<=N-1;j++)
{
mapa[i][j]=MAX; //鄰接矩陣初始化爲無窮遠
}
}
int x,y,z;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
if(z<mapa[x][y]) //防止重邊
mapa[x][y]=z; //有向圖
//無向圖 mapa[x][y]=mapa[y][x]=z;
}
int count=dijkstra(n,m);
if(count==MAX)
printf("No\n");
else
printf("%d\n",count);
}
return 0;
}
djkstra 我的dijkstra模板
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.