当前位置: 首页 > news >正文

单源最短路径

题目描述

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

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

输入格式

第一行为三个正整数n,m,s。 第二行起 m 行,每行三个非负整数 ui​,vi​,wi​,表示从 ui​ 到 vi​ 有一条权值为 wi​ 的有向边。

输出格式

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

输入输出样例

输入

4 6 1
1 2 2
2 3 2
2 4 1
1 3 5
3 4 3
1 4 4

输出

0 2 4 3

这就是一道图。

但是用邻接矩阵太浪费空间了,还是用邻接表好一点,邻接表,用的是动态数组,这样会节省空间。

这里定义一个结构体node,里面两个int元素,to和dis,to是到达的节点,dis表示路径长度,让后建立动态数组a,数据类型设为node,输入时的存储就像这样:

a[u].push_back(node{v,w});

 

然后就是写搜索函数,这道题使用的算法是dijkstra

用在这道题上面,那就把点分为两种,蓝点和白点,蓝点就是没有确定最小值的,而白点就是已经确定了的,从s开始找他通往的所有蓝点y,用数组dis记录到达y点的长度,接着,再从剩下的蓝点中,找一个值最小的,标记为白点,以他为基础,查找与之相连的蓝点,如此循环

然后要注意,记录dis记录的同时,如果元素没被访问,就进行入队操作。

最后输出dis数组的值就行了

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int n,m,s;
struct node{int to,dis;friend bool operator <(node a,node b){return a.dis>b.dis;}
};
priority_queue<node>q;
vector<node>a[N];
int dis[N];
int vis[N];
void dij(){for(int i=1;i<=n;i++)dis[i]=INT_MAX;dis[s]=0;q.push(node{s,0});while(!q.empty()){node t=q.top();q.pop();int x=t.to;if(vis[x]==1)continue;vis[x]=1;for(int i=0;i<a[x].size();i++){int y=a[x][i].to;int z=a[x][i].dis;dis[y]=min(dis[y],dis[x]+z);if(vis[y]==0)q.push(node{y,dis[y]});}}
}
signed main(){scanf("%lld%lld%lld",&n,&m,&s);int u,v,w;for(int i=1;i<=m;i++){scanf("%lld%lld%lld",&u,&v,&w);a[u].push_back(node{v,w});}dij();for(int i=1;i<=n;i++)printf("%lld ",dis[i]);
}

相关文章:

  • Qlib-Server:量化库数据服务器
  • Apache HBase(二)
  • 康耐视visionpro-CogBlobTool工具详细说明
  • 指标监控和归因分析——数据异常波动
  • ssm网上订餐管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目采用线性算法
  • 安装paddle detection心得
  • FFmpeg开发笔记(十五)详解MediaMTX的推拉流
  • 计算机专业学习单片机有什么意义吗?
  • git2consul+consul+gitlab连接
  • 自动发卡平台源码优化版,支持个人免签支付
  • Unity2018发布安卓报错 Exception: Gradle install not valid
  • 大数据导论-大数据分析——沐雨先生
  • 数据库---PDO
  • Radio Silence for mac 好用的防火墙软件
  • 探索多种数据格式:JSON、YAML、XML、CSV等数据格式详解与比较
  • ➹使用webpack配置多页面应用(MPA)
  • Angular4 模板式表单用法以及验证
  • 初识 webpack
  • 翻译:Hystrix - How To Use
  • 记录:CentOS7.2配置LNMP环境记录
  • 将 Measurements 和 Units 应用到物理学
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 前端路由实现-history
  • 我从编程教室毕业
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 新书推荐|Windows黑客编程技术详解
  • 一个完整Java Web项目背后的密码
  • 自动记录MySQL慢查询快照脚本
  • MyCAT水平分库
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​TypeScript都不会用,也敢说会前端?
  • ​一些不规范的GTID使用场景
  • #100天计划# 2013年9月29日
  • $.proxy和$.extend
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (C++17) optional的使用
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (二)斐波那契Fabonacci函数
  • (二十三)Flask之高频面试点
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (算法)Game
  • (译)计算距离、方位和更多经纬度之间的点
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .htaccess 强制https 单独排除某个目录
  • .NET 4.0中的泛型协变和反变
  • .net core 控制台应用程序读取配置文件app.config
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .net2005怎么读string形的xml,不是xml文件。
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .net开发引用程序集提示没有强名称的解决办法
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...