Dijkstra求最短路径

本文介绍了Dijkstra求最短路径算法,适用于无负权边的图搜索问题。阐述了算法的操作步骤,包括选择最近顶点、更新相邻节点距离等,并通过实例进行解释。文章还探讨了算法的疑惑点,如为何循环n-1次即可、处理负权边的限制,以及代码中关键变量t的意义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.问题适用情景

求一个顶点到其余各个顶点最短路径的长度。

边的集合中不能有负权边(不能有权值为负数的边)。

2.操作

在顶点集合S中选出距离起点最近的顶点t。

利用顶点t更新与t相邻节点的距离。

顶点t移出集合S。

重复上述步骤直到所有点移出集合S。

3.栗子

王卓老师课程9分种开始

离散数学最短路

4.练习

5.代码

朴素版

#include<iostream>
#include<cstring>
using namespace std;

const int N=510;
int n,m;  // n个结点,m条边
int g[N][N];  // 存储图的邻接矩阵
int dist[N];  // 从起点到编号为i的结点的距离dist[i]
bool st[N];  // 标记编号为i的结点是否在集合内

int dijkstra(int start)
{
   memset(dist,0x3f,sizeof dist);
   dist[start]=0;  // 起点到起点的距离为0
   for(int i=0;i<n;i++)  // 操作n次,每次从集合移出一个节点
   {
     int t=-1;
     for(int j=1;j<=n;j++)  // 从1到n中寻找距离起点最近的节点
      if(!st[j]&&(t==-1||dist[j]<dist[t])) t=j;  // 该节点在集合中,并且是集合中距离起点最近的点
     for(int j=1;j<=n;j++)
      dist[j]=min(dist[j],dist[t]+g[t][j]);  // 利用节点t更新相邻节点的最短距离
     st[t]=true;  // 标记该节点,移出集合
   }
   if(dist[n]==0x3f3f3f3f)return -1;
   return dist[n];
}
int main()
{
   scanf("%d%d",&n,&m);
   me
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值