题目描述

给定一个 NN 个点,MM 条有向边的带非负权图,请你计算从 SS 出发,到每个点的距离。

数据保证你能从 SS 出发到任意点。

输入格式

第一行为三个正整数 N, M, SN,M,S。 第二行起 MM 行,每行三个非负整数 u_i, v_i, w_iu

i

​ ,v

i

​ ,w

i

​ ,表示从 u_iu

i

​ 到 v_iv

i

​ 有一条权值为 w_iw

i

​ 的边。

输出格式

输出一行 NN 个空格分隔的非负整数,表示 SS 到每个点的距离。

输入输出样例

输入 #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

说明/提示

样例解释请参考 数据随机的模板题。

1 \leq N \leq 1000001≤N≤100000;

1 \leq M \leq 2000001≤M≤200000;

S = 1S=1;

1 \leq u_i, v_i\leq N1≤u

i

​ ,v

i

​ ≤N;

0 \leq w_i \leq 10 ^ 90≤w

i

​ ≤10

9

,

0 \leq \sum w_i \leq 10 ^ 90≤∑w

i

​ ≤10

9

本题数据可能会持续更新,但不会重测,望周知。

2018.09.04 数据更新 from @zzq

链式前向星的模板,可以过本题。第二个代码是vector建图的模板,不卡常的情况下很好使。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <map>
#include <set>
#include <vector>
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb std::ios::sync_with_stdio(false)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define gg(x) getInt(&x)
using namespace std;
typedef long long ll;
inline void getInt(int* p);
/*** TEMPLATE CODE STARTS HERE ***/
const int maxn=100010;
const int MAXM=200000;
// const int INF= 0x3f3f3f3f; struct Edge
{
int to,next;
ll dist;
Edge(){}
Edge(int tt,ll dd)
{
to=tt;
dist=dd;
}
bool operator < (const Edge x ) const
{
return dist > x.dist;
}
}edge[MAXM];
int head[maxn],tot;
void addedge(int u,int v,ll c)
{
edge[tot].to = v;
edge[tot].next = head[u];
edge[tot].dist=c;
head[u] = tot++;
}
priority_queue<Edge> heap;
ll dis[maxn];
int t,n,star;
bool vis[maxn];
void dijkstra (int strat)
{
// memset(dis,INF,sizeof(dis));
repd(i,1,n)
{
dis[i]=1e18;
vis[i]=0;
}
dis[strat]=0;
heap.push(Edge(strat,dis[strat]));
while(!heap.empty())
{
Edge x= heap.top();
heap.pop();
int u=x.to;
if(vis[u])
{
continue;
}
vis[u]=1;
for(int i = head[u];i != -1;i = edge[i].next)
{
Edge now = edge[i];
if(dis[now.to]>x.dist+now.dist)
{
dis[now.to]=x.dist+now.dist;
heap.push(Edge(now.to,dis[now.to]));
}
}
} }
int main()
{
scanf("%d %d %d",&n,&t,&star);
int a,b,d;
memset(head,-1,sizeof(head));
repd(i,1,t)
{
scanf("%d %d %d",&a,&b,&d);
addedge(a,b,d);
}
dijkstra(star);
repd(i,1,n)
{
printf("%lld ",dis[i]);
} return 0;
} inline void getInt(int* p) {
char ch;
do {
ch = getchar();
} while (ch == ' ' || ch == '\n');
if (ch == '-') {
*p = -(getchar() - '0');
while ((ch = getchar()) >= '0' && ch <= '9') {
*p = *p * 10 - ch + '0';
}
}
else {
*p = ch - '0';
while ((ch = getchar()) >= '0' && ch <= '9') {
*p = *p * 10 + ch - '0';
}
}
}

l洛谷P4779 【模板】单源最短路径(标准版)(dijkstra)的更多相关文章

  1. 单源最短路径问题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 ...

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

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

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

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

  4. 单源最短路径 Bellman_ford 和 dijkstra

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

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

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

  6. 洛谷 P3371 【模板】单源最短路径(堆优化dijkstra)

    题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数.出发点的编号. 接下来M行每行包含三 ...

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

    题目:给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 解法:spfa算法. 1 #include<cstdio> 2 #include<cstdlib> 3 #in ...

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

    如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 主要还是再打一遍最短路,这种算法我用的不多... #include<bits/stdc++.h> using namesp ...

  9. 单源最短路径—Bellman-Ford和Dijkstra算法

    Bellman-Ford算法:通过对边进行松弛操作来渐近地降低从源结点s到每个结点v的最短路径的估计值v.d,直到该估计值与实际的最短路径权重相同时为止.该算法主要是基于下面的定理: 设G=(V,E) ...

随机推荐

  1. redis(2)事务的订阅与发布

    一.shell终端进行事务的订阅与发布(异步) 发布 : publish channel message [root@localhost ~]# redis-cli -p -h 192.168.42. ...

  2. GB 和 GiB 的区别

    GB 和 GiB 的区别 Gibibyte (GiB) is one of the standard units used in the field of data processing and da ...

  3. 恒生投资交易系统性O3性能测量

    --每秒交易所成交量select b.tps, b.l_business_time from (select count(*) as tps, a.l_business_time from trade ...

  4. charles安装&破解

    走在测试的道路上,我们总归要学习抓包,仅仅是为了更好的定位bug出现的位置.抓包工具何其之多,但是我个人推荐的是charles,主要是因为windows和ios可以同时使用,这样就可以方便不少.不废话 ...

  5. OnCustomDraw

    ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, &CMyListCtrl::OnNMCustomdraw) ON_NOTIFY : Comes from a child co ...

  6. react navigation goBack()返回到任意页面(不集成redux) 一

    方案一: 一.适用场景:在app端开发的时候,相反回到某一个页面的时候保持跳转页面的所有状态不更新,也就是说不触发新的生命周期. 例如:A——>B——>C——>D 要想从D页面直接返 ...

  7. 爱伪装(AWZ)/爱立思(ALS)改机改串一键新机原理分析

    简介 爱伪装(AWZ)/爱立思(ALS)是一款iOS越狱系统上的改机工具,可以修改多种系统参数达到伪装设备型号及各种软硬件属性的目的,同时提供了防越狱检测机制,常用于iOS上的推广刷量,配合代理/VP ...

  8. Java ——类型转换 向args传递参数

    本节重点思维导图  自动类型转换 整型.实型(常量).字符型数据可以混合运算 运算中,不同类型的数据先转化为同一类型,然后进行运算 转换从低级到高级 低 ----------------------- ...

  9. java application.properties 密码加密

    main方法 public static void main(String[] args) { BasicTextEncryptor textEncryptor = new BasicTextEncr ...

  10. Java基础(七)

    字符串String类 字符串的两个问题 构造方法 字符串池 字符串的内容不可变 比较方法 练习:模拟登陆 练习:模拟登陆(限制重试次数) 替换方法(敏感词过滤) 如果希望将字符串当中指定的部分进行替换 ...