最短路径dijs+优先队列 模板

Posted djf666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最短路径dijs+优先队列 模板相关的知识,希望对你有一定的参考价值。

P3371 【模板】单源最短路径(弱化版)

    • 17.5K通过
    • 56.1K提交
  • 题目提供者HansBug 站长团
  • 评测方式云端评测
  • 标签O2优化高性能
  • 难度普及/提高-
  • 时空限制1000ms / 128MB

  题解   

  • 提示:收藏到任务计划后,可在首页查看。

最新讨论显示

推荐的相关题目显示

题目背景

本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步 P4779

题目描述

如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度。

输入输出格式

输入格式:

 

第一行包含三个整数N、M、S,分别表示点的个数、有向边的个数、出发点的编号。

接下来M行每行包含三个整数Fi、Gi、Wi,分别表示第i条有向边的出发点、目标点和长度。

 

输出格式:

 

一行,包含N个用空格分隔的整数,其中第i个整数表示从点S出发到点i的最短路径长度(若S=i则最短路径长度为0,若从点S无法到达点i,则最短路径长度为2147483647)

 

输入输出样例

输入样例#1: 复制
4 6 1
1 2 2
2 3 2
2 4 1
1 3 5
3 4 3
1 4 4
输出样例#1: 复制
0 2 4 3

说明

时空限制:1000ms,128M

数据规模:

对于20%的数据:N<=5,M<=15;

对于40%的数据:N<=100,M<=10000;

对于70%的数据:N<=1000,M<=100000;

对于100%的数据:N<=10000,M<=500000。保证数据随机。

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f 
using namespace std;
int n, m;
struct node
{
    int to, cost;
};
struct node2
{
    bool friend operator < (node2 n1, node2 n2)
    {
        return n1.d > n2.d;
    }
    int id, d;
};
vector<node>g[200000+10];
bool finish[200000+10];
int dis[200000+10];
void myinit()
{
    memset(finish, 0, sizeof(finish));
    for(int i = 0; i < 200001; i++)
    {
        g[i].clear();
    }
    memset(dis, inf, sizeof(dis));
}
void dijkstra(int s)
{
    priority_queue<node2> q;
    dis[s] = 0; 
    node2 nn1;
    nn1.id = s; nn1.d = dis[s];
    q.push(nn1);
    while(!q.empty())
    {
        node2 nn2 = q.top();
        q.pop();
        int now = nn2.id;
        if(finish[now])continue;
        else finish[now] = 1;
        for(int i = 0; i < g[now].size(); i++)
        {
            if(!finish[g[now][i].to] && g[now][i].cost + dis[now] < dis[g[now][i].to])
            {
                dis[g[now][i].to] = g[now][i].cost + dis[now];
            }
            node2 nn3;
            nn3.id = g[now][i].to; nn3.d = dis[g[now][i].to];
            q.push(nn3);
        }
    }
}
int main()
{
    int i, j, x, y, c, s, t;
    while(scanf("%d%d%d", &n, &m,&s)!=EOF)
    {
        myinit();
        for(i = 0; i < m; i++)
        {
            scanf("%d%d%d", &x, &y, &c);
            node n1;
            n1.to = y; n1.cost = c;
            g[x].push_back(n1);
        }
        dijkstra(s);
        for(t=1;t<=n;t++){
        if(dis[t] == inf)
        cout<<"2147483647";
        else
        cout<<dis[t];
        if(t==n)printf("
");
        else printf(" ");
        }
    }
    return 0;
}

 



以上是关于最短路径dijs+优先队列 模板的主要内容,如果未能解决你的问题,请参考以下文章

单源最短路径(dij+堆优化)

最短路问题 Dijkstra算法- 路径还原

P4779 模板单源最短路径(标准版) 题解

优先队列优化dij算法通用模板

单源最短路径模板(弱化版)

dijkstra算法模板(优先队列优化)