//根据大神模板修改加注释的我的小菜鸟模板,如有错误欢迎指正!
#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模板
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.