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(); // 清空邻接表}
}

迪杰斯特拉算法的应用相关推荐

  1. 迪杰斯特拉算法(C语言实现)

    迪杰斯特拉算法(C语言实现) 如上图,求以a为源点到个顶点的最短路劲. #include "stdio.h" #include "stdlib.h" //用一个 ...

  2. C++迪杰斯特拉算法求最短路径

    一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...

  3. 迪杰斯特拉算法——PAT 1003

    本文主要是将我对于我对于迪杰斯特拉算法的理解写出来,同时通过例题来希望能够加深对于算法的理解,其中有错误的地方希望大家指正. 迪杰斯特拉算法 我将这个算法理解成一个局部到整体的算法,这个方法确实越研究 ...

  4. 单源最短路径-Dijkstra(迪杰斯特拉算法)

    迪杰斯特拉算法时间复杂度为O(n^2),其中n为顶点个数. 该算法用于求单源最短路径.并且图中的边不允许带负权值. #include <iostream> using namespace ...

  5. JavaScript实现dijkstra迪杰斯特拉算法(附完整源码)

    JavaScript实现dijkstra迪杰斯特拉算法 PriorityQueue完整源代码 MinHeap.js完整源代码 Heap.js完整源代码 Comparator.js完整源代码 dijks ...

  6. C++实现Dijkstra(迪杰斯特拉)算法(附完整源码)

    C++Dijkstra迪杰斯特拉算法的实现 C++Dijkstra(迪杰斯特拉)算法的完整源码(定义,实现,main函数测试) C++Dijkstra(迪杰斯特拉)算法的完整源码(定义,实现,main ...

  7. C语言实现Dijkstra(迪杰斯特拉)算法(附完整源码)

    Dijkstra迪杰斯特拉 Graph结构体定义 迪杰斯特拉算法完整源码(定义,实现,main函数测试) Graph结构体定义 struct Graph {int vertexNum;int **ed ...

  8. 狄斯奎诺算法 c语言,图的邻接表实现迪杰斯特拉算法(C语言).doc

    图的邻接表实现迪杰斯特拉算法(C语言) /*迪杰斯特拉算法(狄斯奎诺算法)解决的是从源点到其它所有顶点的最短路径问题*/ //算法实现: #include #include #define MAX 2 ...

  9. java迪杰斯特拉算法介绍_178-迪杰斯特拉(Dijkstra)算法基本介绍

    2.网上数据结构和算法的课程不少,但存在两个问题: 1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了 2) ...

  10. 【数据结构】图的应用(普利姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、拓扑排序)

    最小生成树 什么是最小生成树 是一棵树 - 无回路 - |V|个顶点一定有|V|-1条边 是生成树 - 包含全部顶点 - |V|-1条边全在图里 贪心算法 什么是"贪":每一步都要 ...

最新文章

  1. 计算机操作培训主持词,魅力女性沙龙会主持词文稿.docx
  2. 独家 | 建立软件的经济学分析框架,浅议开源软件的经济学特性(附图解)
  3. 【算法】双指针算法 ( 有效回文串 II )
  4. Nordic nRF5 SDK和softdevice介绍
  5. VS2015提示gets未定义
  6. android自学之旅——layout资源文件
  7. python三维圆曲面_python – matplotlib中的曲面和三维轮廓
  8. mac系统安装python(2.7)requests库
  9. 天行数据API智能机器人接口
  10. 马哥linux docker视频,[其他] 马哥Docker + K8S 视频教程
  11. Linux下 python调用讯飞离线语音合成(tts)
  12. 电子邮箱怎么填写格式,手机邮箱格式怎么填写?
  13. OpenCV 自带示例sample中的双目校正stereo_calib.cpp 安装与解读
  14. 推荐几个高效文章搜索网站
  15. 诊断2018微商:从乱象到赋能,世界微商大会发明的新玩法为您指路
  16. 微信公众平台开发(34)微相册
  17. python中如何输出空格换行_Python将文件中空格变成换行的方法如何做
  18. mysql 减号与下划线_匹本中文、字母、数字、下划线、减号的正则表达式,这样写为什么不对?...
  19. 前端页面中根据链接随机生成二维码
  20. Jfinal engin 集成shiro标签支持

热门文章

  1. Delphi 控制摄像头操作
  2. idea2018.3 无需注册码破解,完美使用100年
  3. 洛达1536u升级固件_最新Airpods蓝牙耳机华强北二代终极版洛达1562M
  4. Android 一键分享功能
  5. 利用ESP8266Audio库实现ESP8266语音播报功能
  6. yslow3.1.2_YSlow 2.0:最初的草图
  7. 如何用区块链防止学历造假?
  8. 从电子请柬切入,顺利融资3000万美金,“低频”的婚庆市场应该怎么做?
  9. 什么是项目管理资格认证
  10. linux dns配置srv记录,一个关于MS AD + Bind DNS的棘手问题--SRV记录