迪杰斯特拉算法的应用
1.问题描述
穷游?“穷”游? | ||
---|---|---|
Time Limit: 1000 MS | Memory Limit: 10000 KB |
Description
贫穷的小A有一个梦想,就是到t国去一次穷游,但现实是残酷的。小A所在的世界一共有n(n<=500) 个国家,国家与国家之间总共有E(E<=50000)条道路相连,第i个国家对于进入它的外国人都要收取Bi 的费用,而小A家住在s国,他必须通过这些道路在各个国家之间中转最终到达t国(除非他运气够好 可以直接从s国到达t国)。但是贫穷的小A只剩下M(M<=100)元家底了,因此他必须精打细算旅途的 费用,同时小A对于t国实在太向往了,因此他希望能够走最短的路尽快到达t国。这个问题难倒了小 A,现在他请你帮他算一算他到达t国的最短路径有多长。
Input
第一行输入T(T<=10)表示有T组数据。每组数据第一行输入n、E、s、t、M,分别表示小A所在世界 的国家数、国家之间的总道路数、小A的国籍、小A向往的国家以及小A的家底;接下来一行输入n个正 整数Bi,表示第i个国家收取的过路费(由于小A是s国人,因此s国不会收取,但t国会);接下来输 入E行每行三个正整数u(1<=u<=n)、v(1<=v<=n)、w,表示u国和v国之间存在着一条长度为w的无 向边(可能有重边)。输入保证最终结果不会使int溢出。
Output
输出T行正整数,第i行表示第i组数据小A花费不超过M元到达t国的最短路。若小A无法到达t国,输 出-1.
Sample Input
3 2 2 1 2 10 20 10 1 2 1 1 2 2 3 1 1 3 10 1 1 1 2 3 1 3 3 1 3 10 1 11 1 1 2 1 1 2 3 2 3 1
Sample Output
1 -1 -1
2.算法分析
此题中,目的是求从S国到T国的最短路径,显然应使用迪杰斯特拉算法。相应的收费可以看做边到边的权重,最终的花费为最短路径的权重和。若小于M,则小A可以到达,若大于M则小A无法到达
#include<iostream>
#include<algorithm>
#include<string.h>
#include<vector>
#include<queue>
using namespace std;// 结构体表示图中的一条边
struct country {int v, w; // 顶点和权重
};vector <country> world[505]; // 图的邻接表表示// 结构体表示图中的一个顶点
struct vertex {int m, dis, v; // m: 剩余的金钱,dis: 距离,v: 顶点
};// 自定义比较函数,用于优先队列的排序
struct mycompare {bool operator()(vertex a, vertex b) {return a.dis > b.dis; // 根据距离比较顶点}
};priority_queue<vertex, vector<vertex>, mycompare> arr; // 用于Dijkstra算法的优先队列int main() {int T, n, E, s, t, M, x, y, z;cin >> T; // 读取测试用例的数量int cost[505]; // 数组用于存储每个顶点的成本int distance[505][105]; // 二维数组用于存储最短距离bool flag[505][105]; // 二维数组用于跟踪访问过的顶点while (T--) { // 遍历每个测试用例memset(distance, -1, sizeof(distance)); // 将距离数组初始化为-1memset(flag, true, sizeof(flag)); // 将标记数组初始化为truecin >> n >> E >> s >> t >> M; // 读取顶点数、边数、起点、终点和初始金钱for (int i = 1; i <= n; i++)cin >> cost[i]; // 读取每个顶点的成本for (int i = 0; i < E; i++) {cin >> x >> y >> z; // 读取边的起点、终点和权重country temp;temp.v = y;temp.w = z;world[x].push_back(temp); // 将边添加到起点的邻接表中temp.v = x;world[y].push_back(temp); // 将边添加到终点的邻接表中(无向图)}vertex temp;temp.m = M; temp.dis = 0; temp.v = s; distance[temp.v][M] = 0;arr.push(temp); // 将起点加入优先队列while (!arr.empty()) {temp = arr.top(); // 取出距离最小的顶点arr.pop();int p = temp.v;if (!flag[p][temp.m] || temp.dis > distance[temp.v][temp.m]) continue; // 如果顶点已被访问过或距离更大,则跳过此次循环flag[p][temp.m] = false; // 标记顶点为已访问for (int i = 0; i < world[p].size(); i++) {int v = world[p][i].v;if (v == s) continue; // 如果顶点为起点,则跳过此次循环if (temp.m >= cost[v] && (distance[v][temp.m - cost[v]] == -1 || temp.dis + world[p][i].w < distance[v][temp.m - cost[v]])) {distance[v][temp.m - cost[v]] = temp.dis + world[p][i].w; // 更新距离数组vertex point;point.dis = temp.dis + world[p][i].w;point.m = temp.m - cost[v];point.v = v;arr.push(point); // 将新的顶点加入优先队列}}}int ans = 1000000;bool index = 0;for (int i = 0; i <= M; i++) {if (distance[t][i] != -1) {ans = min(ans, distance[t][i]); // 更新最短距离index = 1;}}if (!index)cout << -1 << endl;elsecout << ans << endl;for (int i = 1; i <= n; i++)world[i].clear(); // 清空邻接表}
}
迪杰斯特拉算法的应用相关推荐
- 迪杰斯特拉算法(C语言实现)
迪杰斯特拉算法(C语言实现) 如上图,求以a为源点到个顶点的最短路劲. #include "stdio.h" #include "stdlib.h" //用一个 ...
- C++迪杰斯特拉算法求最短路径
一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...
- 迪杰斯特拉算法——PAT 1003
本文主要是将我对于我对于迪杰斯特拉算法的理解写出来,同时通过例题来希望能够加深对于算法的理解,其中有错误的地方希望大家指正. 迪杰斯特拉算法 我将这个算法理解成一个局部到整体的算法,这个方法确实越研究 ...
- 单源最短路径-Dijkstra(迪杰斯特拉算法)
迪杰斯特拉算法时间复杂度为O(n^2),其中n为顶点个数. 该算法用于求单源最短路径.并且图中的边不允许带负权值. #include <iostream> using namespace ...
- JavaScript实现dijkstra迪杰斯特拉算法(附完整源码)
JavaScript实现dijkstra迪杰斯特拉算法 PriorityQueue完整源代码 MinHeap.js完整源代码 Heap.js完整源代码 Comparator.js完整源代码 dijks ...
- C++实现Dijkstra(迪杰斯特拉)算法(附完整源码)
C++Dijkstra迪杰斯特拉算法的实现 C++Dijkstra(迪杰斯特拉)算法的完整源码(定义,实现,main函数测试) C++Dijkstra(迪杰斯特拉)算法的完整源码(定义,实现,main ...
- C语言实现Dijkstra(迪杰斯特拉)算法(附完整源码)
Dijkstra迪杰斯特拉 Graph结构体定义 迪杰斯特拉算法完整源码(定义,实现,main函数测试) Graph结构体定义 struct Graph {int vertexNum;int **ed ...
- 狄斯奎诺算法 c语言,图的邻接表实现迪杰斯特拉算法(C语言).doc
图的邻接表实现迪杰斯特拉算法(C语言) /*迪杰斯特拉算法(狄斯奎诺算法)解决的是从源点到其它所有顶点的最短路径问题*/ //算法实现: #include #include #define MAX 2 ...
- java迪杰斯特拉算法介绍_178-迪杰斯特拉(Dijkstra)算法基本介绍
2.网上数据结构和算法的课程不少,但存在两个问题: 1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了 2) ...
- 【数据结构】图的应用(普利姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、拓扑排序)
最小生成树 什么是最小生成树 是一棵树 - 无回路 - |V|个顶点一定有|V|-1条边 是生成树 - 包含全部顶点 - |V|-1条边全在图里 贪心算法 什么是"贪":每一步都要 ...
最新文章
- 计算机操作培训主持词,魅力女性沙龙会主持词文稿.docx
- 独家 | 建立软件的经济学分析框架,浅议开源软件的经济学特性(附图解)
- 【算法】双指针算法 ( 有效回文串 II )
- Nordic nRF5 SDK和softdevice介绍
- VS2015提示gets未定义
- android自学之旅——layout资源文件
- python三维圆曲面_python – matplotlib中的曲面和三维轮廓
- mac系统安装python(2.7)requests库
- 天行数据API智能机器人接口
- 马哥linux docker视频,[其他] 马哥Docker + K8S 视频教程
- Linux下 python调用讯飞离线语音合成(tts)
- 电子邮箱怎么填写格式,手机邮箱格式怎么填写?
- OpenCV 自带示例sample中的双目校正stereo_calib.cpp 安装与解读
- 推荐几个高效文章搜索网站
- 诊断2018微商:从乱象到赋能,世界微商大会发明的新玩法为您指路
- 微信公众平台开发(34)微相册
- python中如何输出空格换行_Python将文件中空格变成换行的方法如何做
- mysql 减号与下划线_匹本中文、字母、数字、下划线、减号的正则表达式,这样写为什么不对?...
- 前端页面中根据链接随机生成二维码
- Jfinal engin 集成shiro标签支持
热门文章
- Delphi 控制摄像头操作
- idea2018.3 无需注册码破解,完美使用100年
- 洛达1536u升级固件_最新Airpods蓝牙耳机华强北二代终极版洛达1562M
- Android 一键分享功能
- 利用ESP8266Audio库实现ESP8266语音播报功能
- yslow3.1.2_YSlow 2.0:最初的草图
- 如何用区块链防止学历造假?
- 从电子请柬切入,顺利融资3000万美金,“低频”的婚庆市场应该怎么做?
- 什么是项目管理资格认证
- linux dns配置srv记录,一个关于MS AD + Bind DNS的棘手问题--SRV记录