给定一个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的更多相关文章

  1. ACM - 最短路 - AcWing 849 Dijkstra求最短路 I

    AcWing 849 Dijkstra求最短路 I 题解 以此题为例介绍一下图论中的最短路算法.先让我们考虑以下问题: 给定一个 \(n\) 个点 \(m\) 条边的有向图(无向图),图中可能存在重边 ...

  2. 849. Dijkstra求最短路 I(模板)

    给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值. 请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出-1. 输入格式 第一行包含整数n和m. 接下来m行每行包 ...

  3. AcWing 849. Dijkstra求最短路 I 朴素 邻接矩阵 稠密图

    //朴素Dijkstra 边权都是正数 稠密图:点和边差的比较多 #include<cstring> #include<iostream> #include<algori ...

  4. acwing 849 Dijkstra求最短路 I 模板

    地址 https://www.acwing.com/problem/content/description/851/ 给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值. 请你求出 ...

  5. 关于dijkstra求最短路(模板)

    嗯....   dijkstra是求最短路的一种算法(废话,思维含量较低,   并且时间复杂度较为稳定,为O(n^2),   但是注意:!!!!         不能处理边权为负的情况(但SPFA可以 ...

  6. Aizu-2249 Road Construction(dijkstra求最短路)

    Aizu - 2249 题意:国王本来有一个铺路计划,后来发现太贵了,决定删除计划中的某些边,但是有2个原则,1:所有的城市必须能达到. 2:城市与首都(1号城市)之间的最小距离不能变大. 并且在这2 ...

  7. 850. Dijkstra求最短路 II

    给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值. 请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出-1. 输入格式 第一行包含整数n和m. 接下来m行每行包 ...

  8. POJ-2387(原始dijkstra求最短路)

    Til the Cows Come Home POJ-2387 这题是最简单的最短路求解题,主要就是使用dijkstra算法,时间复杂度是\(O(n^2)\). 需要注意的是,一定要看清楚题目的输入要 ...

  9. Dijkstra求次短路

    #10076.「一本通 3.2 练习 2」Roadblocks:https://loj.ac/problem/10076 解法: 次短路具有一种性质:次短路一定是由起点到点x的最短路 + x到y的距离 ...

随机推荐

  1. 886C. Petya and Catacombs#墓室探险(set集合)

    题目出处:http://codeforces.com/problemset/problem/886/C 题目大意:很多墓穴之间有通道,探险家来回穿梭并记录日志 日志规则:第一次到该墓穴计时间t,0&l ...

  2. 注册服务和发现服务 Eureka

    来自蚂蚁课堂: 注册服务和发现服务 1.原理如图: 注册中心负载均衡: 实践 注册中心 集群:

  3. 14. docker 网络 docker bridge0 详解

    1.创建一个 container docker run -d --name test1 busybox /bin/sh -c "while true; do sleep 3600; done ...

  4. mysql字段修改脚本

    -- help_text:帮助说明 -- help_content -- raw USE pro_seal_chip_sell_portal_v1; -- 表修改ALTER TABLE `help_t ...

  5. elasticsearch min_hash 应用分析

    需求作相似文本查询 爬虫作页面去重,会用到simhash,第一个想到的是用simhash算法 但在现有数据集(elasticsearch集群)上用simhash,成本高,simhash值还好计算,不论 ...

  6. play framework在eclipse中自动的预编译生成precompiled文件

    一.修改 eclipe 中的启动文件属性eclipse/*.launch 中的最后一条:加入参数 -Dprecompile=yes  将会在启动项目时,进行项目的预编译 (将在项目中生成 precom ...

  7. php先响应后处理

    php响应异步请求或者返回时效要求高的接口中,可以先响应输出,再执行逻辑处理保存数据等任务 ob_end_clean(); ob_start(); echo '{"data":&q ...

  8. 5-7 学生cpp成绩统计

    完成“学生cpp成绩计算”之后,修改Person和Student类,各自增加两个无参构造函数. 仍以Person类为基础,建立一个派生类Teacher,增加以下成员数据: int ID;//教师工号 ...

  9. vue_webpack初始化项目

    整体架构:此处npm安装过于缓慢,因此使用的是淘宝的镜像cnpm vue+webpack 初始化项目:1.安装vue: cnpm install vue 检验版本: vue -V2.创建一个vue项目 ...

  10. Java面试题4-附答案

    BIO.NIO和AIO的区别   Java BIO : 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程 ...