博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Luogu 3371【模板】单源最短路径
阅读量:5111 次
发布时间:2019-06-13

本文共 1142 字,大约阅读时间需要 3 分钟。

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的基本用法。

更稳定的算法详见

#include
#define maxn 10000+5#define maxm 500000+5using 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
2333333)printf("2147483647 ");else printf("%d ",dis[i]); return 0;}

转载于:https://www.cnblogs.com/ADMAN/p/9157719.html

你可能感兴趣的文章
[无关] 胡言乱语3
查看>>
Leetcode 29. Divide Two Integers
查看>>
thinkPHP--SQL查询
查看>>
winrar 弹窗处理
查看>>
关于IO流的抽象类
查看>>
2019.1.26
查看>>
伪静态的实现方法:IIS环境下配置
查看>>
Selenium-webdriver系列教程(三)————如何执行一段js脚本
查看>>
使用debussy完成自动仿真
查看>>
MyEclipse中Web项目的发布和运行
查看>>
【模板】最短路
查看>>
理解 Lua 的那些坑爹特性
查看>>
Windows WMIC命令使用详解(附实例)
查看>>
如何从Powerdesigner进行数据建模并生成SQL脚本
查看>>
发现微信支付bug
查看>>
MVC过滤器---异常处理过滤器
查看>>
你不知道的常用 代码分析 规范
查看>>
rlwrap
查看>>
断点续传
查看>>
iBatis/MyBatis
查看>>