朴素dijkstra算法

在单源最短路问题中,处理所有边都是正权边情况如果图是稠密图(边很多),那么就会使用朴素的dijkstra算法。时间复杂度是n^2。

这个算法需要关注的地方有两个,分别是存储稠密图的方式和算法的具体实现。

1.稠密图的存储方式,稠密图一般采用邻接矩阵的方式存储(简单点说就是一个二维数组),用一个ab的二元数组来存储a到b的距离。

2.dijkstra算法的实现方法,具体分为定义和两个实现步骤      

定义:N:题目给定的数据范围。 bool st【N】存储是否已知到达该位置的最短路。 int dis【N】表示到达该点的距离。

实现1.对于距离的定义,dis【1】定义为0,其余的所有dis均定义为正无穷,可以用0x3f3f3f3f来用一个很大的数来代替正无穷。

实现2.迭代找出当前没有确定最小值中的距离最小值,该最小值确定为以确定最短路径,迭代所有点的由现在最小值得到的新距离。

给出一个具体模板

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=520;
int p[N][N],dis[N],st[N];
int n,m,t;
int dijkstra(){
    memset(dis,0x3f,sizeof dis);
    dis[1]=0;
    for(int i=0;i<n;i++){
        t=-1;
        for(int j=1;j<=n;j++){
            if(!st[j]&&(t==-1||dis[j]<dis[t]))
                t=j;
        }
        st[t]=true;
        
        for(int j=1;j<=n;j++){
            dis[j]=min(dis[j],dis[t]+p[t][j]);
        }
    }
    if(dis[n]==0x3f3f3f3f) return -1;
    else return dis[n];
}
int main()
{
    memset(p,0x3f,sizeof p);
    cin >> n >> m;
    for(int i=0;i<m;i++){
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        p[x][y]=min(p[x][y],z);
    }
    cout << dijkstra();
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值