题解 | #【模板】单源最短路2#
【模板】单源最短路2
https://www.nowcoder.com/practice/7c1740c3d4ba4b3486df4847ee6e8fc7
#include<iostream>
#include<climits> // 使用INT_MAX所需要引入的头文件
using namespace std;
int main()
{
const int N = 5000; // 注意题干,图的点数是固定值5000
int G[N + 1][N + 1]; // 用于模拟邻接矩阵进行建图
for(int i = 1; i <= N; i++)
{
for(int j = 1; j <= N; j++)
{
G[i][j] = INT_MAX; // 先将邻接矩阵全部初始化为无穷大
}
}
int n, m;
cin>>n>>m;
int u, v, w;
for(int i = 1; i <= m; i++)
{
cin>>u>>v>>w;
G[u][v] = w;
G[v][u] = w; // 注意为无向图,需要关于主对角线对称,因此两边都需要存储
}
int dist[N + 1]; // 用于存储每个顶点当前与源点的最短距离
bool flag[N + 1]; // 用于记录每个顶点是否已经完成与源点最短距离的计算处理
for(int i = 1; i <= N; i++)
{
dist[i] = G[1][i]; // 初始设置为邻接矩阵中源点所在 行 的权值
flag[i] = false;
}
dist[1] = 0;
flag[1] = true; // 将源点加入已处理集合
for(int i = 2; i <= N; i++)
{
int tmp = INT_MAX, index = 1;
for(int j = 1; j <= N; j++) // 遍历寻找与源点的最短距离
{
if(flag[j] == false && dist[j] < tmp)
{
tmp = dist[j];
index = j;
}
}
if(index != 1)
{
flag[index] = true; // 找到后将其加入已处理集合
}
for(int j = 1; j <= N; j++)
{
if(flag[j] == false && G[index][j] != INT_MAX)
{
if(G[index][j] + dist[index] < dist[j])
{
dist[j] = G[index][j] + dist[index]; // 新的距离比原距离更短,则进行更新
}
}
}
}
if(dist[n] != INT_MAX)
{
cout<<dist[n];
}
else // 没有从源点到达该顶点的边
{
cout<<-1;
}
return 0;
}


查看1道真题和解析