题面

既然是模板, 那就直接贴代码?

两种思路

1.迪杰斯特拉

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int N = ;
int head[N], cnt, n, m, s;
long long dis[N];
bool vis[N];
struct node {
int next, to;
long long w;
}e[N];
void add(int x, int y, long long z) {
e[++cnt].next = head[x];
e[cnt].to = y;
e[cnt].w = z;
head[x] = cnt;
}
void dijkstra(int s) {
for(int i = ; i <= n; i++) dis[i] = ;
dis[s] = ;
for(int i = ; i <= n; i++) {
int k = , maxn = ;
for(int j = ; j <= n; j++)
if(!vis[j] && dis[j] <= maxn)
k = j, maxn = dis[j];
vis[k] = ;
for(int j = head[k]; j; j = e[j].next)
if(dis[e[j].to] > dis[k] + e[j].w)
dis[e[j].to] = dis[k] + e[j].w;
}
}
int main () {
scanf("%d%d%d", &n, &m, &s);
for(int i = ; i <= m; i++) {
int x, y;
long long z;
scanf("%d%d%lld", &x, &y, &z);
add(x, y, z);
}
dijkstra(s);
for(int i = ; i <= n; i++)
printf("%lld ", dis[i]);
return ;
}

2.spfa

#include <iostream>
#include <cstdio>
#include <queue>
#define N 500005
#define inf 2147483647
using namespace std;
int n, m, s, cnt;
int dis[N], vis[N], head[N];
struct node {
int next, to, w;
}tr[N];
void add (int x, int y, int z) {
tr[++cnt].to = y;
tr[cnt].next = head[x];
tr[cnt].w = z;
head[x] = cnt;
}
void spfa () {
queue<int> q;
for (int i = ; i <= n; i++)
dis[i] = inf;
vis[s] = ;
q.push(s);
dis[s] = ;
while (!q.empty()) {
int he = q.front();
q.pop();
vis[he] = ;
for (int i = head[he]; i ;i = tr[i].next) {
if (dis[tr[i].to] > dis[he] + tr[i].w) {
dis[tr[i].to] = dis[he] + tr[i].w;
if (!vis[tr[i].to]) {
vis[tr[i].to] = ;
q.push(tr[i].to);
}
}
}
}
}
int main () {
scanf ("%d%d%d", &n, &m, &s);
for (int i = ; i <= m; i++) {
int a, b, c;
scanf ("%d%d%d", &a, &b, &c);
add (a, b, c);
}
spfa ();
for (int i = ; i <= n; i++)
if (s == i) printf ("0 ");
else printf ("%d ", dis[i]);
return ;
}

add:2019.8.15

增加堆优化后的迪杰斯特拉算法;

用来切标准版

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int N = ;
int n, m, s, cnt, head[N], dis[N];
bool vis[N];
struct node{
int next, to, w;
}e[N];
int read() {
int s = , w = ;
char ch = getchar();
while(!isdigit(ch)){if(ch == '-') w = -;ch = getchar();}
while(isdigit(ch)){s = s * + ch - '';ch = getchar();}
return s * w;
}
void add(int x, int y, int z) {
e[++cnt].next = head[x];
e[cnt].to = y;
e[cnt].w = z;
head[x] = cnt;
}
struct Node {
int u, v;
bool operator<(const Node &b) const {
return u > b.u;
}
};
void dijikstra(int s) {
priority_queue <Node> q;
memset(dis, 0x3f3f3f3f, sizeof(dis));
dis[s] = ;
Node o;
o.u = ;
o.v = s;
q.push(o);
while(!q.empty()) {
int u = q.top().v;
int d = q.top().u;
q.pop();
if(d != dis[u])continue;
for(int i = head[u]; i; i = e[i].next) {
int v = e[i].to;
int w = e[i].w;
if(dis[v] > dis[u] + w) {
dis[v] = dis[u] + w;
Node p;
p.u = dis[v], p.v = v;
q.push(p);
}
}
}
}
int main () {
n = read();
m = read();
s = read();
while(m--) {
int x, y, z;
x = read();
y = read();
z = read();
add (x, y, z);
}
dijikstra(s);
for(int i = ; i <= n; i++)
printf("%d ", dis[i]);
return ;
}

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

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

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

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

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

  3. 洛谷P3371单源最短路径Dijkstra版(链式前向星处理)

    首先讲解一下链式前向星是什么.简单的来说就是用一个数组(用结构体来表示多个量)来存一张图,每一条边的出结点的编号都指向这条边同一出结点的另一个编号(怎么这么的绕) 如下面的程序就是存链式前向星.(不用 ...

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

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

  5. 洛谷 P3371 【模板】单源最短路径(弱化版) 题解

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

  6. 洛谷P3371 【模板】单源最短路径

    P3371 [模板]单源最短路径 282通过 1.1K提交 题目提供者HansBug 标签 难度普及/提高- 提交  讨论  题解 最新讨论 不萌也是新,老司机求带 求看,spfa跑模板40分 为什么 ...

  7. 洛谷 P3371 【模板】单源最短路径

    P3371 [模板]单源最短路径 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数.出 ...

  8. 【原创】洛谷 LUOGU P3371 【模板】单源最短路径

    P3371 [模板]单源最短路径 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数.出 ...

  9. 洛谷 P4779【模板】单源最短路径(标准版)

    洛谷 P4779[模板]单源最短路径(标准版) 题目背景 2018 年 7 月 19 日,某位同学在 NOI Day 1 T1 归程 一题里非常熟练地使用了一个广为人知的算法求最短路. 然后呢? 10 ...

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

    P3371 [模板]单源最短路径(弱化版) SPFA算法: SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路径,以及判负权环.SPFA 最坏情况下复 ...

随机推荐

  1. asp.net core 系列之Reponse caching 之 Response Caching Middleware(4)

    这篇文章介绍 Response Caching Middleware . Response Caching Middleware in ASP.NET Core 通过在ASP.NET Core应用中 ...

  2. 换个语言学一下 Golang (11)——使用包和测试

    Go天生就是为了支持良好的项目管理体验而设计的. 包 在软件工程的实践中,我们会遇到很多功能重复的代码,比如去除字符串首尾的空格.高质量软件产品的特点就是它的部分代码是可以重用的,比如你不必每次写个函 ...

  3. 学习笔记之正则表达式 (Regular Expressions)

    正则表达式_百度百科 http://baike.baidu.com/link?url=ybgDrN2WQQKN64_gu-diCqdeDqL8LQ-jiQ-ftzzPaNUa9CmgBRDNnyx50 ...

  4. 英语rubyspinel红尖晶石rubyspinel单词

    红尖晶石(rubyspinel或Red spinel)其红色是因含铬而致^像红宝石和红色石榴子石一样,红 尖晶石也曾被叫作红玉,这就造成了红色宝石的混乱,因为世界上一些最大的著名“红宝 石”,如英国王 ...

  5. ip黑名单-做过ssh扫描黑的ip

    # # hosts.deny This file contains access rules which are used to # deny connections to network servi ...

  6. 几种线程相关的map介绍

    Java中平时用的最多的Map集合就是HashMap了,它是线程不安全的. 看下面两个场景: 1.当用在方法内的局部变量时,局部变量属于当前线程级别的变量,其他线程访问不了,所以这时也不存在线程安全不 ...

  7. python之路第三天

    2018年 7月 13 日 while循环语句: 输出1-5的数 s = 1 whlie s < 6: print(s) 用while循环输入 1 2 3 4 5 6  8 9 10 while ...

  8. JS 基本操作

    1.判断数据是否包含某些数据 var ary=[{age:20,name:"a"},{age:20,name:"b"},,{age:30,name:" ...

  9. 神舟笔记本Hasee安装Ubuntu Desktop和Gnome

    目录 1. 安装Ubuntu-desktop 2. 解决hasee T97 WiFi.声音输入输出.无法关机问题 3. 更新grub启动引导 4. 安装缺失的驱动(否则4.15内核无法进入桌面) 5. ...

  10. 洛谷 P3071 [USACO13JAN]座位Seating(线段树)

    P3071 [USACO13JAN]座位Seating 题目链接 思路: 一开始把题给读错了浪费了好多时间呜呜呜. 因为第二个撤离操作是区间修改,所以我们可以想到用线段树来做.对于第一个操作,我们只需 ...