7-9 旅游规划 (25 分)(Dijkstra算法)

题意:

?

思路:单源最短路问题,Dijkstra算法搞定就可以了,因为要找出最便宜的最短路,所以需要在更新最短距离的时候加一个条件(即当最短距离相等的时候,如果该路径的花费更小,就更新最小花费)就可以了。之前自己学的最短路的水平也就仅限于模板题的水平,现在可以在条件上稍微加一些变化,做了数据结构的作业,顺便加深了自己对最短路(Dijkstra)算法的理解。

题目所给样例的示意图(数据放在了代码的后边):

?

代码: 

 1 #include <iostream>
 2 #include <queue>
 3 #include <cstdio>
 4 #include <algorithm>
 5 #include <cmath>
 6 #include <cstring>
 7 #include <queue>
 8 #include <vector>
 9 #define INF 0x3f3f3f3f
10 #define FRE() freopen("in.txt","r",stdin)
11
12 using namespace std;
13 typedef long long ll;
14 typedef pair<int,int> P;//first是距离,second是点的编号
15 const int maxn = 1000;
16 struct Edge{
17     int to,c,d;
18     Edge(int t,int cost,int dis):to(t),c(cost),d(dis){}
19 };
20 vector<Edge> G[maxn];
21 priority_queue<P, vector<P>, greater<P> > que;
22 int dist[maxn],cost[maxn];
23 int n,m,st,en;
24
25
26 void init(){
27     int s,e,d,c;
28     scanf("%d%d%d%d",&n,&m,&st,&en);
29     for(int i = 0; i<m; i++){
30         scanf("%d%d%d%d",&s,&e,&d,&c);
31         G[s].push_back(Edge(e,c,d));
32         G[e].push_back(Edge(s,c,d));
33     }
34     for(int i = 0; i<n; i++){
35         dist[i] = INF;
36         cost[i] = INF;
37     }
38 }
39
40 int main(){
41     //FRE();
42     init();
43     dist[st] = 0;
44     cost[st] = 0;
45     que.push(P(0,st));//指的是当前点的最短距离
46     while(que.size()){
47         P p = que.top();
48         que.pop();
49         int v = p.second;//当前的点
50         if(p.first > dist[v])continue;
51         //cout<<"v: "<<v;
52         for(int i = 0; i<G[v].size(); i++){
53             Edge e = G[v][i];//当最短距离相等的时候而花费更小的时候,更新最短距离的花费
54             if((dist[e.to] > dist[v]+e.d)||(dist[e.to] == dist[v]+e.d && cost[e.to] > cost[v]+e.c)){
55                 dist[e.to] = dist[v]+e.d;
56                 cost[e.to] = cost[v]+e.c;
57                 //cout<<" cost: "<<cost[e.to];
58                 que.push(P(dist[e.to], e.to));
59             }
60             //cout<<" "<<dist[e.to];
61         }
62         //cout<<endl;
63     }
64     printf("%d %d\n",dist[en],cost[en]);
65     return 0;
66 }
67 /*
68 样例输入:
69 4 5 0 3
70 0 1 1 20
71 1 3 2 30
72 0 3 4 10
73 0 2 2 20
74 2 3 1 20
75 样例输出:
76 3 40
77 */

原文地址:https://www.cnblogs.com/sykline/p/9737881.html

时间: 2024-09-29 08:46:38

7-9 旅游规划 (25 分)(Dijkstra算法)的相关文章

PAT 07-图6 旅游规划 (25分)

有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路费.现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径.如果有若干条路径都是最短的,那么需要输出最便宜的一条路径. 输入格式: 输入说明:输入数据的第1行给出4个正整数NN.MM.SS.DD,其中NN(2\le N\le 5002≤N≤500)是城市的个数,顺便假设城市的编号为0~(N-1N−1):MM是高速公路的条数:SS是出发地的城市编号:DD是目的地的城市编号.随后的MM行中,每行给出一条高

07-图6 旅游规划 (25 分)

有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路费.现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径.如果有若干条路径都是最短的,那么需要输出最便宜的一条路径. 输入格式: 输入说明:输入数据的第1行给出4个正整数N.M.S.D,其中N(2)是城市的个数,顺便假设城市的编号为0~(N−1):M是高速公路的条数:S是出发地的城市编号:D是目的地的城市编号.随后的M行中,每行给出一条高速公路的信息,分别是:城市1.城市2.高速公路长度.收费额,中

进阶实验6-3.2 社交网络图中结点的“重要性”计算 (30分)-dijkstra算法

解题思路:(邻接矩阵存储) 用dijkstra算法依次求出每个结点到其余结点的最短距离 #include <stdio.h> #include <string.h> #define INF 0x3f3f3f3f #define MaxVex 1000+10 int G[MaxVex][MaxVex]; int visit[MaxVex]; int Nv,Ne; void Init() { memset(G,INF,sizeof(G)); int i; for(i=1; i<=

PTA 旅游规划(25 分)

7-10 旅游规划(25 分) 有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路费.现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径.如果有若干条路径都是最短的,那么需要输出最便宜的一条路径. 输入格式: 输入说明:输入数据的第1行给出4个正整数N.M.S.D,其中N(2≤N≤500)是城市的个数,顺便假设城市的编号为0~(N?1):M是高速公路的条数:S是出发地的城市编号:D是目的地的城市编号.随后的M行中,每行给出一条高速公路的信息,分别

带你找到五一最省的旅游路线【dijkstra算法推导详解】

前言 五一快到了,小张准备去旅游了! 查了查到各地的机票 因为今年被扣工资扣得很惨,小张手头不是很宽裕,必须精打细算.他想弄清去各个城市的最低开销. [嗯,不用考虑回来的开销.小张准备找警察叔叔说自己被拐卖,免费被送回来.] 如果他想从珠海飞到拉萨,最少要花多少机票钱呢?下面就说到我们今天要说的这个算法. 迪杰斯特拉(Dijkstra)算法 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为

PTA数据结构与算法题目集(中文) 7-35 城市间紧急救援 (25 分)

PTA数据结构与算法题目集(中文)  7-35 城市间紧急救援 (25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上.当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队. 输入格式: 输入第一行给出4个正整数N.M.S.D,其中N(2)是城市的个数,顺便假设城市的编号为0 ~ (:M是快速道路的条数

利用dijkstra算法规划线路

# dijkstra# 1.在数据库内预先存放了北京市内最新的道路节点,选用优化了得dijkstra算法进行线路规划.    当输入起点和终点后,会计算出最短的路径.同时还能选择查看路径经过的道路节点附近的poi.  2.在数据库内预先存放了北京市内最新的道路节点,选用优化了得dijkstra算法进行线路规划.      当输入起点和终点后,会计算出最短的路径.同时还能选择查看路径经过的道路节点附近的poi.  3.在打包时需要重新申请一个key,不然会出现地图无法显示的错误 源码地址  htt

PTA数据结构与算法题目集(中文) 7-43字符串关键字的散列映射 (25 分)

PTA数据结构与算法题目集(中文)  7-43字符串关键字的散列映射 (25 分) 7-43 字符串关键字的散列映射 (25 分) 给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义的散列函数(将关键字Key中的最后3个字符映射为整数,每个字符占5位:再用除留余数法将整数映射到长度为P的散列表中.例如将字符串AZDEG插入长度为1009的散列表中,我们首先将26个大写英文字母顺序映射到整数0~25:再通过移位将其映射为3:然后根据表长得到,即是该字符串的散列映射位置. 发生冲突时请

旅游规划(25)

这道题一开始我用dfs写了一次 = = 结果时间超限 对于这种最短路径的问题来讲,效率更高的肯定是Floyd算法和Dijkstra算法 单源最短路径最好自然是用Dijkstra,不过Floyd写起来简单,我就这样写咯 #include <iostream> #define INF 99999 using namespace std; int n, m, s, d; int map[500][500]; int price[500][500]; int main() { /*纯洁的初始化!*/