洛谷 P4779 【模板】单源最短路径(标准版) 题解
时间:2019-10-17
本文章向大家介绍洛谷 P4779 【模板】单源最短路径(标准版) 题解,主要包括洛谷 P4779 【模板】单源最短路径(标准版) 题解使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
P4779 【模板】单源最短路径(标准版)
题目背景
2018 年 7 月 19 日,某位同学在 NOI Day 1 T1 归程 一题里非常熟练地使用了一个广为人知的算法求最短路。
然后呢?
100 \rightarrow 60100→60;
Ag \rightarrow CuAg→Cu;
最终,他因此没能与理想的大学达成契约。
小 F 衷心祝愿大家不再重蹈覆辙。
题目描述
给定一个 NN 个点,MM 条有向边的带非负权图,请你计算从 SS 出发,到每个点的距离。
数据保证你能从 SS 出发到任意点。
输入格式
第一行为三个正整数 N, M, SN,M,S。 第二行起 MM 行,每行三个非负整数 u_i, v_i, w_iui,vi,wi,表示从 u_iui 到 v_ivi 有一条权值为 w_iwi 的边。
输出格式
输出一行 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≤ui,vi≤N;
0 \leq w_i \leq 10 ^ 90≤wi≤109,
0 \leq \sum w_i \leq 10 ^ 90≤∑wi≤109。
本题数据可能会持续更新,但不会重测,望周知。
2018.09.04 数据更新 from @zzq
【完整代码】
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
struct point
{
int w;//路径的长度
int x;//点的标号
bool operator < (const point & xx)const//重载运算符
{
return xx.w < w;
}
};
priority_queue<point>q;//保证每次都拿最小的路径来更新
const int Max = 400005;
struct node
{
int y,z;
int ne;
}a[Max];
int sum = 0;
int n,m,s;
int head[Max >> 2];
void add(int x,int y,int z)//插入邻接矩阵
{
a[++ sum].y = y;
a[sum].ne = head[x];
a[sum].z = z;
head[x] = sum;
}
int dis[Max >> 2];
bool use[Max >> 2];
void dj()
{
dis[s] = 0;//自己到自己的距离为0
q.push((point){0,s});
while(!q.empty())
{
point qwq = q.top();
q.pop();
int x = qwq.x,w = qwq.w;
if(use[x] == true)//没个点只能用来更新一次
continue;//不放进去也没有办法更新
else
use[x] = true;
for(register int i = head[x];i != 0;i = a[i].ne)
{
int awa = a[i].y;
if(dis[awa] > dis[x] + a[i].z)//松弛操作
{
dis[awa] = dis[x] + a[i].z;//更新
if(use[awa] == false)//没有入队
q.push((point){dis[awa],awa});//入队
}
}
}
}
int main()
{
int x,y,z;
scanf("%d%d%d",&n,&m,&s);
for(register int i = 1;i <= n;++ i)
dis[i] = 0x7fffffff;//赋值一个极大数
for(register int i = 1;i <= m;++ i)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
dj();
for(register int i = 1;i <= n;++ i)
cout << dis[i] << " ";
return 0;
}
原文地址:https://www.cnblogs.com/acioi/p/11690296.html
- .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
- .Net 转战 Android 4.4 日常笔记(3)--目录结构分析
- .Net 转战 Android 4.4 日常笔记(2)--HelloWorld入门程序
- 读书笔记(二)对象激活和上下文
- 程序员的噩梦有哪些?除了改需求,还有这些…
- UC Berkeley提出新型分布式执行框架Ray:有望取代Spark
- 卡奇话爬虫使用方法以及下载地址
- flash读取XML 背景自动适应大小
- 记录一个发邮件的cs文件
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(56)-插件---单文件上传与easyui使用fancybox
- xml-rpc(2)-first demo_v2
- xml-rpc(1)-first demo
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(55)-工作流设计-表单布局
- 网站源文件被注入了iframe代码—ARP欺骗的木马病毒攻击
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 前端知识点系列二:CSS
- [HTTP趣谈]支持跨域及相关cookie设置
- pytest封神之路第三步 精通fixture
- 前端网络高级篇(六)网站性能优化
- 使用Webrtc和React Js在网络上共享跨平台的点对点文件
- JSBridge小科普
- Greenplum编译安装
- 宏任务和微任务到底是什么?
- React中的setState是异步的吗?
- java安全编码指南之:堆污染Heap pollution
- ECMAScript6基础学习教程(五)对象
- React入门系列(三)创建组件
- prometheus学习笔记(2)-利用java client写入数据
- Vue入门系列(一)Vue技术栈
- Openwrt智能路由系统开发--内容总结