zoukankan      html  css  js  c++  java
  • PAT 07-图6 旅游规划 (25分)

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

    输入格式:

    输入说明:输入数据的第1行给出4个正整数NN、MM、SS、DD,其中NN(2le Nle 5002N500)是城市的个数,顺便假设城市的编号为0~(N-1N1);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;
    }
  • 相关阅读:
    UVA1349 Optimal Bus Route Design 最优巴士路线设计
    POJ3565 Ants 蚂蚁(NEERC 2008)
    UVA1663 Purifying Machine 净化器
    UVa11996 Jewel Magic 魔法珠宝
    NEERC2003 Jurassic Remains 侏罗纪
    UVA11895 Honorary Tickets
    gdb调试coredump(使用篇)
    使用 MegaCLI 检测磁盘状态并更换磁盘
    员工直接坦诚直来直去 真性情
    山东浪潮超越3B4000申泰RM5120-L
  • 原文地址:https://www.cnblogs.com/minesweeper/p/5956069.html
Copyright © 2011-2022 走看看