洛谷 P3371【模板】单源最短路径(弱化版)
既然是模板, 那就直接贴代码?
两种思路
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【模板】单源最短路径(弱化版)的更多相关文章
- luogu P3371 & P4779 单源最短路径spfa & 最大堆优化Dijkstra算法
P3371 [模板]单源最短路径(弱化版) 题目背景 本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步 P4779. 题目描述 如题,给出一个有向图,请输出从某一点出 ...
- 【洛谷 p3371】模板-单源最短路径(图论)
题目:给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 解法:spfa算法. 1 #include<cstdio> 2 #include<cstdlib> 3 #in ...
- 洛谷P3371单源最短路径Dijkstra版(链式前向星处理)
首先讲解一下链式前向星是什么.简单的来说就是用一个数组(用结构体来表示多个量)来存一张图,每一条边的出结点的编号都指向这条边同一出结点的另一个编号(怎么这么的绕) 如下面的程序就是存链式前向星.(不用 ...
- [模板]单源最短路径(Dijkstra)
如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 主要还是再打一遍最短路,这种算法我用的不多... #include<bits/stdc++.h> using namesp ...
- 洛谷 P3371 【模板】单源最短路径(弱化版) 题解
P3371 [模板]单源最短路径(弱化版) 题目背景 本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步 P4779. 题目描述 如题,给出一个有向图,请输出从某一点出 ...
- 洛谷P3371 【模板】单源最短路径
P3371 [模板]单源最短路径 282通过 1.1K提交 题目提供者HansBug 标签 难度普及/提高- 提交 讨论 题解 最新讨论 不萌也是新,老司机求带 求看,spfa跑模板40分 为什么 ...
- 洛谷 P3371 【模板】单源最短路径
P3371 [模板]单源最短路径 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数.出 ...
- 【原创】洛谷 LUOGU P3371 【模板】单源最短路径
P3371 [模板]单源最短路径 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数.出 ...
- 洛谷 P4779【模板】单源最短路径(标准版)
洛谷 P4779[模板]单源最短路径(标准版) 题目背景 2018 年 7 月 19 日,某位同学在 NOI Day 1 T1 归程 一题里非常熟练地使用了一个广为人知的算法求最短路. 然后呢? 10 ...
- 最短路径 SPFA P3371 【模板】单源最短路径(弱化版)
P3371 [模板]单源最短路径(弱化版) SPFA算法: SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路径,以及判负权环.SPFA 最坏情况下复 ...
随机推荐
- 移动开发首页业界资讯移动应用平台技术专题 输入您要搜索的内容 基于Java Socket的自定义协议,实现Android与服务器的长连接(二)
在阅读本文前需要对socket以及自定义协议有一个基本的了解,可以先查看上一篇文章<基于Java Socket的自定义协议,实现Android与服务器的长连接(一)>学习相关的基础知识点. ...
- texstudio基本设置
一开始默认为英文,在上面菜单栏,“option” 1.设置中文:options->general->language->zh-cn 2.编辑和查看按钮: 3.设置默认编译器:选项-& ...
- 完美解决SpringMVC中静态资源无法找到(No mapping found for HTTP request with URI)问题
https://blog.csdn.net/kingmax54212008/article/details/79330308 今天遇到一个比较新奇的问题,但是也应该是使用spring MVC框架时由于 ...
- MySQL之Python与Mysql交互
一:Python操作MySQL步骤 1:Python中操作MySQL的步骤 2.引入模块 在.py文件中引入pymysql模块 import pymysql pymysql是python的一个第三方与 ...
- 如何将一个div盒子水平垂直都居中?
html代码如下: 固定样式: 方法一:利用定位(常用方法,推荐) .parent{ position:relative; } .child{ position:absolute; top:50%; ...
- 【译】itertools
1.Itertools模块迭代器的种类 1.1 无限迭代器: 迭代器 参数 结果 示例 count() start, [step] start, start+step, start+2*step, ...
- Linux基础:sort命令总结
本文只总结一些常用的用法,更详细的说明见man sort和sort --help. sort命令 sort命令用于串联排序指定文件并将结果写到标准输出. sort可以指定按照何种排序规则进行排序,如按 ...
- CC2530 light_switch分析
一些关键字: CCM - Counter with CBC-MAC (mode ofoperation) HAL - HardwareAbstraction Layer (硬件抽象层) ...
- docker中使用阿里云的apt源安装各种实用工具
今天想在docker中安装vim工具,还有其他的软件等等,如果你直接执行apt-get install vim是没有用的,会显示: root@7d43d83fd3a8:/etc/nginx# apt- ...
- 直接将字典转为DataFrame格式时,会出现:ValueError: If using all scalar values, you must pass an index(四种解决方案)
问题:想要将字典直接转为DataFrame格式时,除了字典外没有传入其他参数时,会报错 ValueError: If using all scalar values, you must pass an ...