chenchen题解:朴素版Dijkstra求最短路

本文介绍了如何使用C++实现朴素版的Dijkstra算法解决最短路径问题,详细阐述了算法思想、关键步骤及代码实现。特别强调了在处理稠密图时采用邻接矩阵,并注意了数据初始化和最短路径更新的操作。
摘要由CSDN通过智能技术生成

题目描述:

blablablablablablablablablabla 传送门

算法思想:

由题可知,此题为稠密图,所以用邻接矩阵来存,下面是代码中几个变量的含义:
dist[i] 表示由起点到i点的最短距离
g[i][j] 存图,表示从i点到j点的直接距离(不经过松弛操作的距离)
st[i] 表示i位置的点的最短距离是否已经确定
n,m 节点数和边数
下面是具体步骤:

  1. 在最短路未确定的点中,找距离源点最近的点t
  2. t更新其他点的距离(松弛操作)

注意事项:

  1. 存图之前,现将g数据初始化为无限大,因为可能会有重边,输入的时候取最小边就行
  2. 还要将dist初始化成无限大,如果经过更新后仍为无限大,输出-1即可

时间复杂度:

O ( n 2 + m ) , n 表 示 点 数 , m 表 示 边 数 O(n^2+m), n 表示点数,m 表示边数 O(n2+m),nm

代码实现:

#include <iostream>
#include <cstring>
using namespace std;
const int N=505;
int n,m;
int g[N][N],st[N],dist[N*N];
int di()
{
    memset(dist,0x3f,sizeof(dist));
    dist[1]=0;
    for(int i=0;i<n;i++)
    {
        int t=-1;
        for(int j=1;j<=n;j++)
        {
            if(!st[j] && (t==-1 || dist[t]>=dist[j])) t=j;
        }
        for(int j=1;j<=n;j++)
        {
            if(dist[j]>dist[t]+g[t][j])
            {
                dist[j]=dist[t]+g[t][j];
            }
        }
        st[t]=1;
    }
    if(dist[n]==0x3f3f3f3f) return -1;
    else return dist[n];
}
int main ()
{
    memset(g,0x3f,sizeof(g));
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int a,b,c;
        cin>>a>>b>>c;
        g[a][b]=min(g[a][b],c);
    }
    cout<<di();
    return 0;
}

附上图论作图工具
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值