最短路之Dijkstra算法

接下来介绍比较经典的Dijkstra算法,这种算法在稠密图中发挥着巨大作用,复杂度为O((N+M)logN),我个人觉得他和SPFA差不多,就是一个priority_queue的作用,可能是我理解的不够吧,等暑假的时候好好把这些东西整理整理对比理解吧,最短路的四个算法最好对比着理解,可能会有更深刻的认识,还得多刷题,其中用优先队列这种还是跟qsc大佬学习的,似乎是一个比较懒的办法
附上代码:


/*
时间复杂度:O((N+M)logN)
适用情况:稠密图,和顶点关系密切
不能解决负权
*/
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e4 ;
int n,m;
vector<pair<int,int> > E[maxn];//储存边和距离
int d[maxn];//点s到其他点的距离
priority_queue<pair<int,int> >Q;//储存与遍历过的点直接相连的点
void init()//初始化
{
    for(int i=0;i<=n;i++) E[i].clear();
    for(int i=0;i<=n;i++) d[i]=1e9;
    while(!Q.empty()) Q.pop();
}
int main()
{
    while(cin>>n>>m){//n个点,m条边
    init();
    for(int i=0;i<m;i++) {
        int a,b,c;
        cin>>a>>b>>c;
        E[a].push_back(make_pair(b,c));//a到b的距离为c
        E[b].push_back(make_pair(a,c));//b到a的距离为c
    }
    int s,t;
        cin>>s>>t;//s点到t点的最短距离
        d[s]=0;
        Q.push(make_pair(-d[s],s));//优先队列从大到校排列,-d[s]的结果排出来的第一个是最小的
    while(!Q.empty()) {
            int now=Q.top().second;
            Q.pop();
            for(int i=0;i<E[now].size();i++) {
                int v=E[now][i].first;
                if(d[v]>d[now]+E[now][i].second)
                {d[v]=d[now]+E[now][i].second;
                Q.push(make_pair(-d[v],v));}
                }
                if(now==t) break;
            }
        if(d[t]!=1e9)
        cout<<d[t]<<endl;
        else cout<<-1<<endl;
        /*for(int i=1;i<=n;i++)
        cout<<d[i]<<endl;*/
    }
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值