Luogu 3371【模板】单源最短路径

Luogu 3371【模板】单源最短路径

第一次写博客用图论题来试一试

接下来是正文部分

题目描述

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

输入输出格式

输入格式:

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

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

输出格式:

一行,包含N个用空格分隔的整数,其中第i个整数表示从点S出发到点i的最短路径长度

(若S=i则最短路径长度为0,若从点S无法到达点i,则最短路径长度为2147483647)

输入样例

4 6 1

1 2 2

2 3 2

2 4 1

1 3 5

3 4 3

1 4 4

输出样例

0 2 4 3



这道题目我是用spfa做的,所以我来说一下spfa的基本用法。

更稳定的算法详见hl666大佬的博客

#include<bits/stdc++.h>
#define maxn 10000+5
#define maxm 500000+5
using namespace std;
int la[maxm],ne[maxm],co[maxm],lnk[maxn],dis[maxn],tot=0,n,m,s,q[maxm*2];
//la[],ne[],co[],lnk[]是邻接表用的数组,dis[]表示起始点到各点的距离,q[]是队列数组
bool f[maxn];//f[i]表示i点是否在队中
int read(){
    char c=getchar();
    while(c<‘0‘||c>‘9‘)c=getchar();int x=0;
    while(c>=‘0‘&&c<=‘9‘)x=x*10+c-‘0‘,c=getchar();
    return x;
}
void add(int x,int y,int z){
    ne[++tot]=y;co[tot]=z;la[tot]=lnk[x];lnk[x]=tot;
}//邻接表
void spfa(int x){
    for(int i=1;i<=n;i++)f[i]=true;//true表示该点没有在队中
    for(int i=1;i<=n;i++)dis[i]=23333333;//初始化
    int h=0,t=1;q[1]=x;f[x]=false;dis[x]=0;
    while(h<t){
        int u=q[++h];//将队首取出
        for(int k=lnk[u];k;k=la[k])//以点u为中转点
        if(dis[u]+co[k]<dis[ne[k]]){
            dis[ne[k]]=dis[u]+co[k];
            if(f[ne[k]])q[++t]=ne[k],f[ne[k]]=false;//防止队列溢出
        }
        f[u]=true;
    }
}
int main(){
    n=read();m=read();s=read();
    for(int i=1;i<=m;i++){int x=read(),y=read(),z=read();add(x,y,z);}
    spfa(s);
    for(int i=1;i<=n;i++)if(dis[i]>2333333)printf("2147483647 ");else printf("%d ",dis[i]);
    return 0;
}

原文地址:https://www.cnblogs.com/ADMAN/p/9157719.html

时间: 2024-11-09 22:57:49

Luogu 3371【模板】单源最短路径的相关文章

luogu P3371 &amp; P4779 ---单源最短路径spfa &amp; 最大堆优化Dijkstra

P3371 [模板]单源最短路径(弱化版) 题目背景 本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步 P4779. 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数.出发点的编号. 接下来M行每行包含三个整数Fi.Gi.Wi,分别表示第i条有向边的出发点.目标点和长度. 输出格式: 一行,包含N个用空格分隔的整数,其中第i个整数表示从点S出发到点i

[模板]单源最短路径

https://www.luogu.org/problemnew/show/P3371 1 #include <cstring> 2 #include <cstdio> 3 #include <iostream> 4 #include <queue> 5 #define lop(i,a,b) for(register int i=a;i<=b;++i) 6 const int N = 10010, M = 500010, inf = 214748364

【洛谷 p3371】模板-单源最短路径(图论)

题目:给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 解法:spfa算法. 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 #include<queue> 6 using namespace std; 7 typedef long long LL; 8 9 const int N=10010,M=500010; 10 c

[模板]单源最短路径(Dijkstra)

如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 主要还是再打一遍最短路,这种算法我用的不多... 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 inline int read() 5 { int x=0;bool f=0;char ch=getchar(); 6 while(!isdigit(ch)){ f=(ch==45);ch=getchar();} 7 while(is

P3371 【模板】单源最短路径 如题

P3371 [模板]单源最短路径 时空限制1s / 128MB 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数.出发点的编号. 接下来M行每行包含三个整数Fi.Gi.Wi,分别表示第i条有向边的出发点.目标点和长度. 输出格式: 一行,包含N个用空格分隔的整数,其中第i个整数表示从点S出发到点i的最短路径长度(若S=i则最短路径长度为0,若从点S无法到达点i,则最短路径长度为214

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

P3371 [模板]单源最短路径(弱化版) 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn = 10005; 4 struct edge { 5 int v, w; 6 }; 7 vector<edge> maps[maxn]; 8 int dis[maxn]; 9 bool vis[maxn]; 10 int n, m, s; 11 void add(int u, int v, int w) {

单源最短路径Dijkstra、BellmanFord、SPFA【模板】

Dijkstra算法: 将所有点分为两个集合.如果源点s到u的最短路径已经确定,点u就属于集合Va,否则属于集合Vb. 1.将源点s到图中各点的直接距离当做初始值记录为s到各点的最短距离,不能到达的记为INF.S到S距离为0. 2.在集合Vb中的点中找一个点u,使得源点s到该点u路径长度最短,将u从Vb中除去,加到V1中.这时候求出了当前S到u的最短路径. 3.把新确定的点u更新s到集合Vb中每一个点v的距离,如果s到u的距离加上u到v的直接距离小于当前s到v的距离,则表示新找到的最短路径长度比

Dijkstra算法求单源最短路径

1.最短路径 在一个连通图中,从一个顶点到另一个顶点间可能存在多条路径,而每条路径的边数并不一定相同.如果是一个带权图,那么路径长度为路径上各边的权值的总和.两个顶点间路径长度最短的那条路径称为两个顶点间的最短路径,其路径长度称为最短路径长度. 最短路径在实际中有重要的应用价值.如用顶点表示城市,边表示两城市之间的道路,边上的权值表示两城市之间的距离.那么城市A到城市B连通的情况下,哪条路径距离最短呢,这样的问题可以归结为最短路径问题. 求最短路径常见的算法有Dijkstra算法和Floyd算法

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

单源最短路径的模板题,感谢同学余能的帮助~ #include<bits/stdc++.h> #define inf 2147483647 using namespace std; bool book [200004]; int cnt=0; int head[200020]; int n,m,qq; struct Edge { int to,next,w; }e[2000005]; struct Dis { int to,w; }dis[20000]; struct cmp1 { bool o