洛谷 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 最坏情况下复 ...
随机推荐
- 华为 S5700 交换机 批量修改端口方法
常常在配置交换机端口的时候需要将多个端口设置为相同的配置,当时各端口逐一去配置不仅慢,而且容易出错,这个时候就需要对端口进行批量设置,不仅快捷,而且避免了反复输出容易出错的情况.不同系列.不同版本交换 ...
- 用友U9 UFSoft.UBF.Business.Session
Session的概念 在现在UBF中,Session的本意是work unit,即持久层的一个边界,非常轻,主要用作批量提交,并标识这次批量提交的边界,不涉及到事务等概念. 当前ISession可以通 ...
- scratch学习研究心得_逐步更新
2019-10-30: Scratch对对象a克隆,不能选择克隆自己,这样可能下次一下子同时产生两个克隆体,要设置克隆a scratch3.0采用全新html5技术,图片和其他对象放大缩小,效果几乎不 ...
- 从0开始编写dapper核心功能、压榨性能、自己动手丰衣足食
我偶然听说sqlsugar的性能比dapper强.对此我表示怀疑(由于我一直使用的dapper存在偏见吧),于是自己测试了sqlsugar.freesql.dapper发现他们的给我的结果是 sqls ...
- excel 宏循环行数据 ,Excel统计所有sheet数据行数 VBA
Sub fun1() '统计每一个sheet有多少行数据 Set s1 = Sheets("Sheet1") 'totalok = 0 To Sheets.Count s1.Cel ...
- vue生成pdf
主要参考 https://blog.csdn.net/qq_37880968/article/details/94626001 1.添加模块 npm install --save html2canva ...
- XML简述
XML简述 本文主要内容都是在中国大学MOOC上学习的,这里做个记录. 课程:Java核心技术(进阶),华东师范大学 陈良育老师 感谢陈良育老师,在他的慕课上受益匪浅. XML基本概念 XML(eXt ...
- Webpack如何配置sourceMap
前言:在写这篇文章之前,我必须要吐槽一下webpack了.特别喜欢更新版本,更新就算了,文档还跟不上.文档真的让人迷惑了,大爷的. 背景:由于我正在写sourceMap反向定位源码的功能,所以最近需要 ...
- Python学习日记(三十六) Mysql数据库篇 四
MySQL作业分析 五张表的增删改查: 完成所有表的关系创建 创建教师表(tid为这张表教师ID,tname为这张表教师的姓名) create table teacherTable( tid int ...
- Django之DRF源码分析(二)---数据校验部分
Django之DRF源码分析(二)---数据校验部分 is_valid() 源码 def is_valid(self, raise_exception=False): assert not hasat ...