题目描述

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

输入输出格式

输入格式:

第一行包含三个整数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

样例说明:

堆优化dijkstra

屠龙宝刀点击就送

#include <algorithm>
#include <cstring>
#include <ctype.h>
#include <cstdio>
#include <queue>
using namespace std;
struct Node
{
int x,y;
bool operator <(Node a)const
{
return x>a.x;
}
};
struct node
{
int to,dis,next;
}edge[];
priority_queue<Node>q;
void read(int &x)
{
x=;bool f=;
char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-') f=;
ch=getchar();
}
while(isdigit(ch))
{
x=x*+ch-'';
ch=getchar();
}
x=f?(~x)+:x;
}
bool vis[];
int head[],cnt,T,C,Ts,Te,dis[];
void add(int u,int v,int l)
{
edge[++cnt].to=v;
edge[cnt].next=head[u];
edge[cnt].dis=l;
head[u]=cnt;
}
int main()
{
read(T);read(C);read(Ts);
for(int f,t,v,i=;i<=C;i++)
{
read(f);read(t);read(v);
add(f,t,v);
// add(t,f,v);
}
for(int i=;i<=T;i++) dis[i]=;
dis[Ts]=;
Node a;
a.x=dis[Ts];
a.y=Ts;
q.push(a);
while(!q.empty())
{
Node tmp=q.top();q.pop();
if(vis[tmp.y]) continue;
int v=tmp.y;
vis[v]=;
for(int i=head[v];i;i=edge[i].next)
{
if(dis[edge[i].to]>edge[i].dis+dis[v])
{
dis[edge[i].to]=edge[i].dis+dis[v];
Node a;
a.x=dis[edge[i].to];
a.y=edge[i].to;
q.push(a);
}
}
}
for(int i=;i<=T;i++) printf("%d ",dis[i]);
return ;
}

堆优化dijkstra 548ms

#include <iostream>
#include <cstring>
#include <cstdio> #define INF 2147483647
using namespace std;
typedef long long LL; struct node {
LL to,from,dis;
}e[];
bool vis[];
LL head[],ds[];
LL n,m,s,i,j,tot;
void add(LL u,LL v,LL w)
{
tot++;
e[tot].to=v;
e[tot].dis=w;
e[tot].from=head[u];
head[u]=tot;
}
void spfa(LL k)
{
LL l=,r=,queue[];
for(i=;i<=n;++i)
{
ds[i]=INF;
vis[i]=;
}
ds[k]=;
queue[++r]=k;
while(l<r )
{
LL now=queue[++l];
vis[now]=;
for(i=head[now];i;i=e[i].from)
{
LL v=e[i].to;
if(ds[v]>ds[now]+e[i].dis)
{
ds[v]=ds[now]+e[i].dis;
if(!vis[v])
{
queue[++r]=v;
vis[v]=;
}
}
}
}
}
int main()
{
cin>>n>>m>>s;
LL x,y,z;
for(i=;i<m;++i)
{
cin>>x>>y>>z;
add(x,y,z);
}
spfa(s);
for(i=;i<=n;++i)
cout<<ds[i]<<" ";
}

spfa 2973ms

洛谷 P3371 【模板】单源最短路径(堆优化dijkstra)的更多相关文章

  1. 洛谷P1144 最短路计数【堆优化dijkstra】

    题目:https://www.luogu.org/problemnew/show/P1144 题意:问1到各个节点的最短路有多少条. 思路:如果松弛的时候发现是相等的,说明可以经过该点的最短路径到达当 ...

  2. 洛谷 P1339 [USACO09OCT]热浪Heat Wave (堆优化dijkstra)

    题目描述 The good folks in Texas are having a heatwave this summer. Their Texas Longhorn cows make for g ...

  3. 单源最短路径问题2 (Dijkstra算法)

    用邻接矩阵 /* 单源最短路径问题2 (Dijkstra算法) 样例: 5 7 0 1 3 0 3 7 1 2 4 1 3 2 2 3 5 2 4 6 3 4 4 输出: [0, 3, 7, 5, 9 ...

  4. luogu P3371 & P4779 单源最短路径spfa & 最大堆优化Dijkstra算法

    P3371 [模板]单源最短路径(弱化版) 题目背景 本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步 P4779. 题目描述 如题,给出一个有向图,请输出从某一点出 ...

  5. 图论(四)------非负权有向图的单源最短路径问题,Dijkstra算法

    Dijkstra算法解决了有向图G=(V,E)上带权的单源最短路径问题,但要求所有边的权值非负. Dijkstra算法是贪婪算法的一个很好的例子.设置一顶点集合S,从源点s到集合中的顶点的最终最短路径 ...

  6. 单源最短路径问题之dijkstra算法

    欢迎探讨,如有错误敬请指正 如需转载,请注明出处 http://www.cnblogs.com/nullzx/ 1. 算法的原理 以源点开始,以源点相连的顶点作为向外延伸的顶点,在所有这些向外延伸的顶 ...

  7. 单源最短路径 Bellman_ford 和 dijkstra

    首先两个算法都是常用于 求单源最短路径 关键部分就在于松弛操作 实际上就是dp的感觉 if (dist[e.to] > dist[v] + e.cost) { dist[e.to] = dist ...

  8. 非负权值有向图上的单源最短路径算法之Dijkstra算法

    问题的提法是:给定一个没有负权值的有向图和其中一个点src作为源点(source),求从点src到其余个点的最短路径及路径长度.求解该问题的算法一般为Dijkstra算法. 假设图顶点个数为n,则针对 ...

  9. 说说关于洛谷P4779迪杰斯特拉的堆优化

    众所周知,这题必须要用堆优化的迪杰斯特拉的堆优化才能过,否则60分(错失一等奖) 我没有得过一等奖但还是要说: P4779 全过程: struct node//堆中的比较函数 { int dis; i ...

随机推荐

  1. c# 字节高低位

    byte n = br.ReadByte(); ; // 高位 var l = n & 0x0f; // 低位

  2. YTU 2918: Shape系列-5

    2919: Shape系列-5 时间限制: 1 Sec  内存限制: 128 MB 提交: 251  解决: 199 题目描述 JC和Kitty听说小亮和小华有了Rectangle和Circle并用R ...

  3. linux 下使用exp/imp 或者expdp/impdp导出导入oracle数据表数据

    一.环境配置 1.执行环境: exp/imp可以在客户端执行也可以在服务器端执行,在客户端执行需要先安装有oracle的客户端,如果是linux系统,就是以oracle用户登录,在控制台下执行.建议在 ...

  4. 【POJ 1734】 Sightseeing Trip

    [题目链接] 点击打开链接 [算法] floyd求最小环 输出路径的方法如下,对于i到j的最短路,我们记pre[i][j]表示j的上一步 在进行松弛操作的时候更新pre即可 [代码] #include ...

  5. sass 基本语法

    sass语法 文件后缀名 sass有两种后缀名文件:一种后缀名为sass,不使用大括号和分号:另一种就是我们这里使用的scss文件,这种和我们平时写的css文件格式差不多,使用大括号和分号. 而本教程 ...

  6. 第十七周 - OpenCV 学习笔记 S1 - OpenCV 基本函数

    Imread()函数: 基本功能:读取图像到OpenCv中. 1.函数原型: Mat imwrite(const strings& filename, int flag = 1); 第一个参数 ...

  7. UI:沙盒

    IOS平台下,沙盒的本质就是一个文件夹 每一款IOS应用安装在手机上都会自动的生成一个文件夹.之所以叫沙盒,就是因为这个文件夹是每次运行随机产生的文件夹.沙盒文件夹是独立的,每个应用之间不能互相访问. ...

  8. json知识笔记

    1.全称:JavaScript  Object Notation 2.数据格式 3. 数据结构-object String+基本类型(或者数据结构) 数据结构-Array [基本类型] 4.一个样例a ...

  9. bzoj 2986: Non-Squarefree Numbers【容斥+莫比乌斯函数】

    看到\( 10^10 \)的范围首先想到二分,然后把问题转化为判断\( [1,n] \)内有多少个是某个质数的平方和的数. 所以应该是加上是一个质数的平方的个数减去是两个质数的平方的个数加上是三个质数 ...

  10. bzoj 3159: 决战【LCT】

    只是想复健一下LCT没想到做了不得了的题--调了两天QAQ 题解是这么说的: 但是果然还不太理解--因为swap的前后问题调了好久,(所以一开始养成的习惯后面就不要再改啦-- 总之大概就是把对位置lc ...