dijkstra优化模板 单源最短路模板

本文介绍了一种使用优先队列优化的Dijkstra算法实现方法,详细展示了如何通过C++代码构建图结构,计算从起点到图中各点的最短路径,并提供了完整的代码示例。

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

#include<bits/stdc++.h>
#include<queue>//很重要
using namespace std;
vector<int>g[100005];//记录一个点和那些边相连
vector<int>l[100005];//记录一个点和别的边的长度
int d[100005];//起点到每一点的距离
bool done[100005];//标记是否走过
const int inf=2147483647;
struct Edge
{
    int i;
    int v;
    bool operator < (const Edge& rsh)const//[看不懂来这里](https://www.cnblogs.com/Deribs4/p/5657746.html)
    {
        return rsh.v<v;
    }
};
priority_queue<Edge>q;//必须用优先队列
int main()
{
    int n,m,s;
    scanf("%d%d%d",&n,&m,&s);
    for(int i=1;i<=m;i++)
    {
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        g[x].push_back(y);//压入相连点
        l[x].push_back(z);//压入距离
    }
    for(int i=1;i<=n;i++)
    {
        d[i]=inf;//记为无穷大
    }
    d[s]=0;//起点至0
    Edge h;
    h.i=s;
    h.v=0;
    q.push(h);//压入起点的编号和数值
    while(!q.empty())//若队列不为空
    {
        Edge x;
        x=q.top();//取出首端节点(第一优化,无需便利其它点)
        q.pop();
        if(done[x.i])
        {
            continue;
        }
        done[x.i]=true;
        for(int j=0;j<g[x.i].size();j++)//直接便利长度(优化2,无需便利其它点)
        {
            if(d[g[x.i][j]]>d[x.i]+l[x.i][j])//如果情况更优
            {
                d[g[x.i][j]]=d[x.i]+l[x.i][j];
                Edge k;
                k.i=g[x.i][j];
                k.v=d[g[x.i][j]];
                q.push(k);//重新压入
            }
        }
    }
    for(int i=1;i<=n;i++)
    {
        printf("%d ",d[i]);
    }
    return 0;
}

ps:很多人会认为需更改队列数值(我不会),拜托,这是优先队列

ps:queue头文件可以让你在打出一个队列s.时,会弹出很多函数(队列用的)

vector

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值