849. Dijkstra求最短路 I
给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值。
请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出-1。
输入格式
第一行包含整数n和m。
接下来m行每行包含三个整数x,y,z,表示存在一条从点x到点y的有向边,边长为z。
输出格式
输出一个整数,表示1号点到n号点的最短距离。
如果路径不存在,则输出-1。
数据范围
1≤n≤5001≤n≤500,
1≤m≤1051≤m≤105,
图中涉及边长均不超过10000。
输入样例:
3 3
1 2 2
2 3 1
1 3 4
输出样例:
3
使用条件:
单源最短路
无负边条件
朴素 Dijkstra 算法
因为n与m差太多,是个稠密图,所以用邻接矩阵来存
稀疏图用邻接表存
#include<iostream>
#include<algorithm>
#include<cstring> using namespace std; //500个点 1e5条边,所以用邻接矩阵来写
const int N = 510; int n,m;
int g[N][N];//邻接矩阵
int dist[N];//dijkstra的距离,表示从1到n的最短距离,当前的最短距离
bool st[N];//表示每个点的最短路是否确定 //边权为正所以不可能存在自环,重边的话只用保留两条边长度最短的那条边 int dijkstra(){ //首先初始化距离,初始化为正无穷
memset(dist,0x3f,sizeof dist);
//一号点的距离初始化为0
dist[1] = 0; //迭代n次,找最短路
for(int i = 0;i < n;i++){
//每一次第一步先找到在每一次还没确定的最短路长度的点当中,距离最小的那一个路径长度
int t = -1;//表示还没有确定 //遍历所有的点
for(int j = 1;j <= n;j ++)
//如果当前这个点还没有确定最短路的话
//并且
//当前的点还没确定 或者 当前的t不是最短的距离
if(!st[j] && (t == -1 || dist[t] > dist[j]))
t = j; st[t] = true; //用t来更新其他点的距离
for(int j = 1;j <= n;j++)
//用1~t的距离加上t~j的这个边,来更新1~j这条边
dist[j] = min(dist[j],dist[t] + g[t][j]);
} //1~n是不连通的
if(dist[n] == 0x3f3f3f3f) return -1;
//否则返回1~n的最短距离
return dist[n];
} int main(){
scanf("%d%d",&n,&m); //初始化邻接矩阵
// for(int i = 0;i <= n;i++)
// for(int j = 0;j <= n;j++){
// if(i == j) g[i][j] = 0;
// else g[i][j] = INF;
// } memset(g,0x3f,sizeof g); while(m --){
int a,b,c;
scanf("%d%d%d",&a,&b,&c); g[a][b] = min(g[a][b],c);//取min原因是a,b之间可能会有多条边,保留边的最短距离
} int t = dijkstra(); printf("%d\n",t);
return 0;
}
849. Dijkstra求最短路 I的更多相关文章
- ACM - 最短路 - AcWing 849 Dijkstra求最短路 I
AcWing 849 Dijkstra求最短路 I 题解 以此题为例介绍一下图论中的最短路算法.先让我们考虑以下问题: 给定一个 \(n\) 个点 \(m\) 条边的有向图(无向图),图中可能存在重边 ...
- 849. Dijkstra求最短路 I(模板)
给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值. 请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出-1. 输入格式 第一行包含整数n和m. 接下来m行每行包 ...
- AcWing 849. Dijkstra求最短路 I 朴素 邻接矩阵 稠密图
//朴素Dijkstra 边权都是正数 稠密图:点和边差的比较多 #include<cstring> #include<iostream> #include<algori ...
- acwing 849 Dijkstra求最短路 I 模板
地址 https://www.acwing.com/problem/content/description/851/ 给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值. 请你求出 ...
- 关于dijkstra求最短路(模板)
嗯.... dijkstra是求最短路的一种算法(废话,思维含量较低, 并且时间复杂度较为稳定,为O(n^2), 但是注意:!!!! 不能处理边权为负的情况(但SPFA可以 ...
- Aizu-2249 Road Construction(dijkstra求最短路)
Aizu - 2249 题意:国王本来有一个铺路计划,后来发现太贵了,决定删除计划中的某些边,但是有2个原则,1:所有的城市必须能达到. 2:城市与首都(1号城市)之间的最小距离不能变大. 并且在这2 ...
- 850. Dijkstra求最短路 II
给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值. 请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出-1. 输入格式 第一行包含整数n和m. 接下来m行每行包 ...
- POJ-2387(原始dijkstra求最短路)
Til the Cows Come Home POJ-2387 这题是最简单的最短路求解题,主要就是使用dijkstra算法,时间复杂度是\(O(n^2)\). 需要注意的是,一定要看清楚题目的输入要 ...
- Dijkstra求次短路
#10076.「一本通 3.2 练习 2」Roadblocks:https://loj.ac/problem/10076 解法: 次短路具有一种性质:次短路一定是由起点到点x的最短路 + x到y的距离 ...
随机推荐
- 886C. Petya and Catacombs#墓室探险(set集合)
题目出处:http://codeforces.com/problemset/problem/886/C 题目大意:很多墓穴之间有通道,探险家来回穿梭并记录日志 日志规则:第一次到该墓穴计时间t,0&l ...
- 注册服务和发现服务 Eureka
来自蚂蚁课堂: 注册服务和发现服务 1.原理如图: 注册中心负载均衡: 实践 注册中心 集群:
- 14. docker 网络 docker bridge0 详解
1.创建一个 container docker run -d --name test1 busybox /bin/sh -c "while true; do sleep 3600; done ...
- mysql字段修改脚本
-- help_text:帮助说明 -- help_content -- raw USE pro_seal_chip_sell_portal_v1; -- 表修改ALTER TABLE `help_t ...
- elasticsearch min_hash 应用分析
需求作相似文本查询 爬虫作页面去重,会用到simhash,第一个想到的是用simhash算法 但在现有数据集(elasticsearch集群)上用simhash,成本高,simhash值还好计算,不论 ...
- play framework在eclipse中自动的预编译生成precompiled文件
一.修改 eclipe 中的启动文件属性eclipse/*.launch 中的最后一条:加入参数 -Dprecompile=yes 将会在启动项目时,进行项目的预编译 (将在项目中生成 precom ...
- php先响应后处理
php响应异步请求或者返回时效要求高的接口中,可以先响应输出,再执行逻辑处理保存数据等任务 ob_end_clean(); ob_start(); echo '{"data":&q ...
- 5-7 学生cpp成绩统计
完成“学生cpp成绩计算”之后,修改Person和Student类,各自增加两个无参构造函数. 仍以Person类为基础,建立一个派生类Teacher,增加以下成员数据: int ID;//教师工号 ...
- vue_webpack初始化项目
整体架构:此处npm安装过于缓慢,因此使用的是淘宝的镜像cnpm vue+webpack 初始化项目:1.安装vue: cnpm install vue 检验版本: vue -V2.创建一个vue项目 ...
- Java面试题4-附答案
BIO.NIO和AIO的区别 Java BIO : 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程 ...