题解 | #【模板】单源最短路2#
【模板】单源最短路2
https://www.nowcoder.com/practice/7c1740c3d4ba4b3486df4847ee6e8fc7
Dijkstra
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int main() {
const int N = 5000;
//邻接矩阵与初始化
int G[N+1][N+1];
for(int i=0;i<=N;i++)
for(int j=0;j<=N;j++)
G[i][j] = INT_MAX;
int n,m;
//顶点与边的个数
scanf("%d %d",&n,&m);
int u,v,w;
for(int i=0;i<=m;i++){
scanf("%d %d %d",&u,&v,&w);
G[u][v] = w;
G[v][u] = w;
}
//Djkstra
int dist[N+1];
bool flag[N+1];
//初始距离就是第一行的内容
for(int i = 1;i<=N;i++)
{
dist[i] = G[1][i];
flag[i] = false;
}
//1号默认算过最短
dist[1] = 0;
flag[1] = true;
//从2开始
for(int i =2;i<=N;i++){
int temp = INT_MAX,index = 1;
//得到当前与1距离最小的那一个
for(int j = 1;j<=N;j++)
{
//为访问过的,且目前距离不超过最大值的
if(flag[j] == false && dist[j]<temp)
{
temp = dist[j];
index = j;
}
}
//如果index不为1,既存在别的点距离小
if(index != 1){
flag[index] = true;
}
//index表示当前与1距离最小的那个点,G[index][j]表示为j经过index这个点,并且到1
for(int j = 1;j<=N;j++){
if(flag[j] == false && G[index][j] != INT_MAX){
//j经过index这个点,并且到1的距离小于之前到1 的距离,则修改最小距离为当前的
if(G[index][j]+dist[index]<dist[j])
dist[j] = G[index][j]+dist[index];
}
}
}
//最后n到1的最短距离判断dist[n]
if(dist[n]!=INT_MAX)
printf("%d",dist[n]);
else printf("-1");
return 0;
}

查看16道真题和解析