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行中,每行给出一条高速公路的信息,分别是:城市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[501];
int map[501][501]; /* 2城市之间的距离~ */
int cost[501][501]; /* 2城市之间的路费~ */
int MCost[501];
bool visited[501] = {false}; /* 判断该点是否已经求出最短路 */
/*  dijkstra求最短路的变种~
*/
void dijkstra(int v0,int v,int d) {
    dist[v0] = 0; visited[v0] = true; /* 初始状态 v节点属于集合 */
    int i, w;
    for (i = 1; i < v; i++) { /* 开始主循环 每次求得v到某个顶点的最短路径 并加v到集合 */
        int MIN = INF; /* 当前所知离v0最近的节点 */
        for (w = 0; w < v; w++) {
            if (!visited[w] ) { /* 节点在 结合 V-S中 */
            if (dist[w] < MIN) { /* 找到最短路径节点 */
                    MIN = dist[w];
                    v0 = w;
                }
            }
        }
        visited[v0] = true;
        for (w = 0; 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=0;i<v;i++)
        for (int j = 0; j < v; j++) {
            map[i][j] = map[j][i] = INF;
            cost[i][j] = cost[j][i] = INF;
        }
    for (int i = 0; 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 = 0; i < v; i++) {
        dist[i] = map[i][s];  /* 记录当到出发点的距离 */
        MCost[i] = cost[i][s];
    }
    dijkstra(s,v,d);
    cout << dist[d] <<" "<<MCost[d]<< endl;
    return 0;
}
时间: 2024-10-11 01:27:43

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

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

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

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

1013 Battle Over Cities (25 分) It is vitally important to have all the cities connected by highways in a war. If a city is occupied by the enemy, all the highways from/toward that city are closed. We must know immediately if we need to repair any oth

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

1040 Longest Symmetric String (25 分) Given a string, you are supposed to output the length of the longest symmetric sub-string. For example, given Is PAT&TAP symmetric?, the longest symmetric sub-string is s PAT&TAP s, hence you must output 11. In

pat 1013 Battle Over Cities(25 分) (并查集)

1013 Battle Over Cities(25 分) It is vitally important to have all the cities connected by highways in a war. If a city is occupied by the enemy, all the highways from/toward that city are closed. We must know immediately if we need to repair any othe

pat 1149 Dangerous Goods Packaging(25 分)

1149 Dangerous Goods Packaging(25 分) When shipping goods with containers, we have to be careful not to pack some incompatible goods into the same container, or we might get ourselves in serious trouble. For example, oxidizing agent (氧化剂) must not be

PAT 甲级 1083 List Grades (25 分)

1083 List Grades (25 分) Given a list of N student records with name, ID and grade. You are supposed to sort the records with respect to the grade in non-increasing order, and output those student records of which the grades are in a given interval. I

PAT 甲级 1036 Boys vs Girls (25 分)(简单题)

1036 Boys vs Girls (25 分) This time you are asked to tell the difference between the lowest grade of all the male students and the highest grade of all the female students. Input Specification: Each input file contains one test case. Each case contai

[PTA] PAT(A) 1007 Maximum Subsequence Sum (25 分)

目录 Problem Description Input Output Sample Sample Input Sample Output Solution Analysis Code Problem portal: 1007 Maximum Subsequence Sum (25 分) Description Given a sequence of $K$ integers { $N_{1}?$, $N_{2}?$, $...$, $N_{K}$ }. A continuous subsequ

[PTA] PAT(A) 1012 The Best Rank (25 分)

目录 Problem Solution Analysis Code Problem portal: 1012 The Best Rank (25 分) Solution Analysis ?一名学生有三门科目,以及计算出的一个平均成绩,每一个成绩都会有一个排名,现在想要让你输出某一个同学最高的排名(四种成绩排名的最高),以及对应的科目 ?如果给定的同学的四种课程排名的名次信息已经存在,那么就很简单,在里面找到最小的名次,以及对应的科目输出即可. ?可以创建四个数组,数组的每个元素存储某一门科目的