最短路径(dijistra和floyd算法)
以2021年合肥学院校赛E题为例
题目描述
zs王国中有n个城镇,在这些城镇之间有m条路,bs需要从1号城镇出发去n号城镇完成他的使命,现在请你规划一条路径,使bs走的路径最短,输出最短路径长度,若不能达到n号城镇输出“-1”。
输入描述:
第一行包含整数 n 和 m。
接下来 m 行每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。
输出描述:
输出一个整数,表示 1 号点到 n 号点的最短距离。
如果路径不存在,则输出 −1
样例输入
3 3
1 2 2
2 3 1
1 3 4
样例输出
3
备注:
1≤n≤500,
1≤m≤100000,
图中涉及边长均不超过10000。
这道题就是一道最短路径板子题
dijistra算法
#include<bits/stdc++.h>
using namespace std;
const int INF = INT_MAX;
const int maxn = 1e3;
int G[maxn][maxn];
int d[maxn],n,m;
bool visited[maxn] = {false};
void dijistra() {fill(d, d + maxn, INF);d[1] = 0;//起点到起点的距离为0 for(int i = 1; i <= n; i++) {int u = -1, MIN = INF;for(int j = 1; j <= n; j++) {if(visited[j] == false && d[j] < MIN) {u = j;MIN = d[j];}}if(u == -1) return;//找不到u,则起点到达不了剩下的点 visited[u] = true;for(int v = 1; v <= n; v++) {if(visited[v] == false && G[u][v] != INF && d[u] + G[u][v] < d[v]) d[v] = d[u] + G[u][v];}}
}
int main() {ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);fill(G[0], G[0] + maxn * maxn, INF);cin >> n >> m;while(m--) {int u,v,w;cin >> u >> v >> w;G[u][v] = min(G[u][v], w);//这里要这样写,直接写G[u][v]=w会WA,可能后台数据出现了重复的u v}dijistra();if(d[n] == INF) cout << -1;else cout << d[n];return 0;
}
floyd算法
#include<bits/stdc++.h>
using namespace std;
const int INF = INT_MAX;
const int maxn = 1000;
int G[maxn][maxn];
int d[maxn],n,m;
bool visited[maxn] = {false};
int main() {ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);fill(G[0], G[0] + maxn * maxn, INF);cin >> n >> m;for(int i = 0; i < m; i++) {int u,v,w;cin >> u >> v >> w;G[u][v] = min(G[u][v], w);}for(int i = 1; i <= n; i++) G[i][i] = 0;for(int k=1;k<=n;k++) {for(int i=1;i<=n;i++) {for(int j=1;j<=n;j++) {if(G[i][k] != INF && G[k][j] != INF && G[i][k] + G[k][j] < G[i][j]) G[i][j] = G[i][k] + G[k][j];}}}if(G[1][n] == INF)cout << -1;else cout << G[1][n];return 0;
}
最短路径(dijistra和floyd算法)相关推荐
- 最短路径问题(Floyd算法、Dijkstra算法、Bellman-Ford算法、SPFA算法)
导入 最短路径问题是指在一幅带权图中,找出连接两个顶点之间的所有路径中,边权和最短的那一条.如下图就是一幅带权图,边上的数字就代表该边的权值.解决最短路径问题有多种不同的算法,本文将对它们的基本思想与 ...
- 最短路径—Dijkstra算法和Floyd算法
Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Di ...
- 最短路径Dijkstra算法和Floyd算法整理、
转载自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 最短路径-Dijkstra算法和Floyd算法 Dijks ...
- 最短路径——Floyd算法及优化(蓝桥杯试题集)
*对最短路径问题以及floyd算法.Dijkstra算法不是很理解的同学请移步前几篇博客~ 题目链接: http://lx.lanqiao.cn/problem.page?gpid=T15 问题描述 ...
- 图的最短路径算法及matlab实现(Dijkstra算法、Floyd算法、Bellman-Ford算法、Johnson 算法)
图的最短路径算法 Dijkstra算法 Dijkstra算法研究的是从初始点到其他任一结点的最短路径,即单源最短路径问题,其对图的要求是不存在负权值的边. Dijkstra算法主要特点是以起始点为中心 ...
- Floyd算法、Dijkstra算法例题
二 1.用Floyd算法求解下图各个顶点的最短距离. 2.对于下图使用Dijkstra算法求由顶点a到顶点h的最短路径. 2.解析 1)用Floyd算法求解各个顶点的最短距离. 第一步:画出初始化距离 ...
- C语言实现Floyd算法
题目描述: 有向单源最短路径问题(Floyd算法) 输入格式 第1行:2个空格分开的整数n(2<=n<=500)和m(10<=m<=20000),分别表示图的顶点数和边数. 第 ...
- 算法其实很简单—弗洛伊德(Floyd)算法
目录 1.弗洛伊德(Floyd)算法介绍 2.弗洛伊德(Floyd)算法最佳应用-最短路径 3.弗洛伊德(Floyd)算法图解分析 3.1 弗洛伊德算法的步骤: 4.代码实现 1.弗洛伊德(Floyd ...
- floyd算法:我们真的明白floyd吗?
图论里一个很重要的问题是最短路径问题. 这个问题,在离散数学课上会考,数据结构与算法课上会考,图论课上会考,计算机网络里会考.... 解决最短路径问题有几个出名的算法: 1.dijkstra算法,最经 ...
- 最短路:Floyd算法(Python实现)
Floyd-Warshall算法是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权(但不可存在负权回路)的最短路径问题.Floyd算法的根本原理是动态规划. 算法描述 开始:对于每一对顶点 ...
最新文章
- JVM调优:基本垃圾回收算法
- 计算机网络谢希仁第七版课后答案第五章 传输层
- JavaScript面试系列:JavaScript设计模式之桥接模式和懒加载
- Opencv中常见的滤波方法
- 【JVM】调优笔记1-----堆栈概念的对碰
- Spring的@Configuration配置类-Full和Lite模式
- 个人计算机与手机的区别,手机与电脑的CPU是一回事吗?一共有六大区别,看看你知道多少!...
- Ubuntu的中文是哪种字体?python的词云分析和 三国演义人物出场统计
- cosmos db_开放电影项目Cosmos Laundromat如何使Blender更好
- java的linux内核构建,构建一个Docker 的Java编译环境
- 微信小程序弹框wx.showToast、wx.showModal样式修改
- Spring 注解的原理
- word怎么删除参考文献的横线_Word2010利用尾注做参考文献时如何删除尾注中的横线...
- 基于STC89C52RC的小车黑线钝角、锐角、迷宫、虚线循迹模块化代码
- MYSQL学习日记(三)
- 企业微信加密消息体_微信企业号开发之加密方案与全局返回码说明
- Mstar Mac Phy 驱动学习
- node-red教程3.3 file控件介绍
- 射频卡机井灌溉控制器特点
- 一些程序员必备的英语词汇及释义