朴素Dijkstra算法

文章详细介绍了Dijkstra算法的基本思想和步骤,包括初始化距离、迭代过程、距离更新以及在稠密图中使用邻接矩阵的存储方法。提供了一个C++模板代码,用于求解图中节点到起点的最短路径。
摘要由CSDN通过智能技术生成

1.朴素Dijkstra算法

1.1:首先初始化距离

dis[1]=0,其他的点dis[v]都初始化为正无穷(实际实现中用一个比较大的数代替即可),dis[v]=+无穷;

第一步只有起点被遍历到了,只有它的距离是确定的

1.2:是一个迭代循环的过程,循环n次

for(i,0~n);

一个集合s,当前已确定最短距离的点存到集合s中。

1.2.1首先找到不在集合s中的距离最近的点赋值给t

找到当前还没确定的点当中距离最小的一个点,这个点的距离一定是最短路,基于贪心。距离指一号点到当前点的距离。

1.2.2 把赋值后的t加到集合s中去

1.2.3 用t来更新其他所有点的距离,

更新方式:看一下从t出去的所有的边,他组成的路径能不能更新其他点的距离,看一下是否dis[x]>dis[t]+w(权重),

即:x到1点的距离是否大于1到t再到x的距离,如果大于,那么就更新。

1----t-----x 1--------x

每一次都可以确定一个点的最短距离,n次循环的话就可以确定n个最短距离。就可以确定出来每一个点到起点的最短距离。

例如:

初始dis[1]=0,dis[2]=+无穷,dis[3]=+无穷

最先找到不在集合中的点1,他的距离为0,最小。

然后看1出去的边,有两条边,可以更新两个点,则dis[2]=2(因为2<正无穷),dis[3]=4。

最小值t=2存入s当中,以t=2更新其他点

最后dis[1]=0,dis[2]=2,dis[3]=3

1.3存储

稠密图 ,用邻接矩阵存储

1.4模板

#include <iostream>
#include <cstring>
#include <algorithm>
​
using namespace std;
​
const int N = 510;
int n,m;//点数,边数
int g[N][N];
int dist[N];
bool st[N];
​
int dijkstra()
{
    memset(dist,0x3f,sizeof dist);//0x3f意为正无穷
    dist[1]=0;
    
    for(int i=0;i<n;i++)
    {
        int t=-1;//-1 表示还没有找到
        for(int j=1;j<=n;j++)
            if(!st[j]&&(t==-1||dist[t]>dist[j]))
                //!st[j]表示当前点还没有确定最短路
                //if是在所有距离还没有确定的点(st[j]==false)中找到距离最小的点
                t=j;
        if(t==n) break;
        st[t]=true;
        
        for(int j=1;j<=n;j++)
            dist[j]=min(dist[j],dist[t]+g[t][j]); 
    }
    if(dist[n]==0x3f3f3f3f) return -1;
    else return dist[n];
    
}
int main()
{
    scanf("%d%d",&n,&m);
   memset(g,0x3f,sizeof g);
    
    while(m--)
    {
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        g[a][b]=min(g[a][b],c);
}
    int t=dijkstra();
    printf("%d\n",t);
    return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WAMMA07

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值