有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。

输入格式:

输入说明:输入数据的第1行给出4个正整数NN、MM、SS、DD,其中NN(2\le N\le 5002≤N≤500)是城市的个数,顺便假设城市的编号为0~(N-1N−1);MM是高速公路的条数;SS是出发地的城市编号;DD是目的地的城市编号。随后的MM行中,每行给出一条高速公路的信息,分别是:城市1、城市2、高速公路长度、收费额,中间用空格分开,数字均为整数且不超过500。输入保证解的存在。

输出格式:

在一行里输出路径的长度和收费总额,数字间以空格分隔,输出结尾不能有多余空格。

输入样例:

4 5 0 3
0 1 1 20
1 3 2 30
0 3 4 10
0 2 2 20
2 3 1 20

输出样例:

3 40

/* 题意要求: 保证最短距离,若距离相等 则选取总价格最低的路径
1. dijkstra找最短路 一个新节点加入已找到最短路径的集合S后 更新其他所有点的权重时 需要增加一种情况 就是当距离不变时 更新价格为较小的
那条路的价格 。
*/
#include "iostream"
using namespace std;
#define INF 501
int dist[];
int map[][]; /* 2城市之间的距离~ */
int cost[][]; /* 2城市之间的路费~ */
int MCost[];
bool visited[] = {false}; /* 判断该点是否已经求出最短路 */
/* dijkstra求最短路的变种~
*/
void dijkstra(int v0,int v,int d) {
dist[v0] = ; visited[v0] = true; /* 初始状态 v节点属于集合 */
int i, w;
for (i = ; i < v; i++) { /* 开始主循环 每次求得v到某个顶点的最短路径 并加v到集合 */
int MIN = INF; /* 当前所知离v0最近的节点 */
for (w = ; w < v; w++) {
if (!visited[w] ) { /* 节点在 结合 V-S中 */
if (dist[w] < MIN) { /* 找到最短路径节点 */
MIN = dist[w];
v0 = w;
}
}
}
visited[v0] = true;
for (w = ; w < v; w++) { /* 更新当前的最短路径 */
if (!visited[w] && MIN + map[v0][w] < dist[w]) {
dist[w] = MIN + map[v0][w];
MCost[w] = MCost[v0] + cost[v0][w];
}
else if (!visited[w] && MIN + map[v0][w] == dist[w] && MCost[w] > MCost[v0] + cost[v0][w]) { /* 路径长度相等则选择价格较便宜的一条*/
MCost[w] = MCost[v0] + cost[v0][w];
}
}
}
}
int main() {
int v, e, s, d;
cin >> v >> e >> s >> d;
for(int i=;i<v;i++)
for (int j = ; j < v; j++) {
map[i][j] = map[j][i] = INF;
cost[i][j] = cost[j][i] = INF;
}
for (int i = ; i < e; i++) {
int a, b, c, d;
cin >> a >> b >> c >> d;
map[a][b] = map[b][a] = c;
cost[a][b] = cost[b][a] = d;
}
for (int i = ; i < v; i++) {
dist[i] = map[i][s]; /* 记录当到出发点的距离 */
MCost[i] = cost[i][s];
}
dijkstra(s,v,d);
cout << dist[d] <<" "<<MCost[d]<< endl;
return ;
}

PAT 07-图6 旅游规划 (25分)的更多相关文章

  1. 【(图) 旅游规划 (25 分)】【Dijkstra算法】

    #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> us ...

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

    题目地址 https://pta.patest.cn/pta/test/15/exam/4/question/717 5-9 旅游规划   (25分) 有了一张自驾旅游路线图,你会知道城市间的高速公路 ...

  3. PTA 7-10(图) 旅游规划 最短路问题

    7-10(图) 旅游规划 (25 分) 有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路费.现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径.如果 ...

  4. PAT乙级:1090危险品装箱(25分)

    PAT乙级:1090危险品装箱(25分) 题干 集装箱运输货物时,我们必须特别小心,不能把不相容的货物装在一只箱子里.比如氧化剂绝对不能跟易燃液体同箱,否则很容易造成爆炸. 本题给定一张不相容物品的清 ...

  5. PAT乙级:1070 结绳 (25分)

    PAT乙级:1070 结绳 (25分) 题干 给定一段一段的绳子,你需要把它们串成一条绳.每次串连的时候,是把两段绳子对折,再如下图所示套接在一起.这样得到的绳子又被当成是另一段绳子,可以再次对折去跟 ...

  6. PAT 甲级 1013 Battle Over Cities (25 分)(图的遍历,统计强连通分量个数,bfs,一遍就ac啦)

    1013 Battle Over Cities (25 分)   It is vitally important to have all the cities connected by highway ...

  7. PAT 甲级 1040 Longest Symmetric String (25 分)(字符串最长对称字串,遍历)

    1040 Longest Symmetric String (25 分)   Given a string, you are supposed to output the length of the ...

  8. PAT 甲级 1017 Queueing at Bank (25 分)(模拟题,有点思维小技巧,第二次做才理清思路)

    1017 Queueing at Bank (25 分)   Suppose a bank has K windows open for service. There is a yellow line ...

  9. 【刷题-PAT】A1126 Eulerian Path (25 分)

    1126 Eulerian Path (25 分) In graph theory, an Eulerian path is a path in a graph which visits every ...

随机推荐

  1. poj 3373 Changing Digits (DFS + 记忆化剪枝+鸽巢原理思想)

    http://poj.org/problem?id=3373 Changing Digits Time Limit: 3000MS   Memory Limit: 65536K Total Submi ...

  2. responsive web design

    http://d.alistapart.com/responsive-web-design/ex/ex-site-flexible.html http://alistapart.com/article ...

  3. linux下core文件调试方法

    http://www.cnblogs.com/li-hao/archive/2011/09/25/2190278.html 在程序不寻常退出时,内核会在当前工作目录下生成一个core文件(是一个内存映 ...

  4. Jmeter 执行java脚本结束时提示:he JVM should have exitted but did not

    使用jmeter执行java协议测试结束时会提示:he JVM should have exitted but did not ,jmeter2.11以后的可以 通过设置:      jmeteren ...

  5. 转--Server “**” has shut down the connection prematurely一例分析

    近几天在性能测试过程中,发现loadrunner Controller经常报 Server “**” has shut down the connection prematurely .概率很高,现象 ...

  6. 图像色彩空间YUV和RGB的差别

    http://blog.csdn.net/scg881008/article/details/7168637 假如是200万像素的sensor,是不是RGB一个pixel是2M,YUV是1M? 首先, ...

  7. [Unity菜鸟] Mecanim 系统遇到的问题

    1. 给角色添加一个Animator组件和New State,运行后,摆出这种奇怪的姿势 这是因为没有把动画片段赋给New State,可以看到此时的New State为空,把Idle片段拖进去就好了 ...

  8. 自编的CHtmlView浏览器,怎么截获超连接,不让新窗口在IE中打开

    blog <自编的CHtmlView浏览器,怎么截获超连接,不让新窗口在IE中打开>    http://bbs.csdn.net/topics/10299197    http://so ...

  9. linux进程间通信方式

    (1)管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信. (2)命名管道(named pipe):命名管道克服了管道没有名字的限制,因此,除具 ...

  10. 添加service到SystemService硬件服务

    添加service到SystemService: 添加硬件服务. 创建时间:2015年3月9日(星期一) 晚上11:07 | 分类:硬件驱动Android | 天气: 修改时间:2015年3月10日( ...