【PAT甲级】1030. Travel Plan (30)

来源:互联网 发布:mac激活时间查询 编辑:程序博客网 时间:2024/06/10 01:32
#include <stdio.h>#define MAX 9999999typedef struct Ci {    int dist;    int cost;} Ci;Ci map[501][501];int n, m, s, d;int main(int argc, char *argv[]) {    scanf("%d %d %d %d", &n, &m, &s, &d);    int i, j, k;    for (i = 0; i < n; i++) {        for (j = 0; j < n; j++) {            if (i != j) {                map[i][j].dist = map[j][i].dist = MAX;                map[i][j].cost = map[j][i].cost = MAX;            } else {                map[i][j].dist = 0;                map[i][j].cost = 0;            }        }    }    for (i = 0; i < m; i++) {        int a, b, ds, cs;        scanf("%d %d %d %d", &a, &b, &ds, &cs);        map[a][b].dist = map[b][a].dist = ds;        map[a][b].cost = map[b][a].cost = cs;    }    int set[501] = {0};    int route[501] = {0};    int ds[501], cs[501];    for (i = 0; i < n; i++)        ds[i] = cs[i] = MAX;    set[s] = 1;    ds[s] = 0;    cs[s] = 0;    route[s] = -1;    int t = n - 1;    int p = s;    while (t-- > 0) {        set[p] = 1;        for (i = 0; i < n; i++) {            if (set[i] == 0) {                if (ds[p] + map[p][i].dist < ds[i]) {                    ds[i] = ds[p] + map[p][i].dist;                    cs[i] = cs[p] + map[p][i].cost;                    route[i] = p;                } else if (ds[p] + map[p][i].dist == ds[i]) {                    if (cs[i] > cs[p] + map[p][i].cost) {                        cs[i] = cs[p] + map[p][i].cost;                        route[i] = p;                    }                }            }        }        int mindis = MAX;        int minIndex = 0;        for (i = 0; i < n; i++) {            if (set[i] == 0 && ds[i] < mindis) {                mindis = ds[i];                minIndex = i;            }        }        p = minIndex;        if (p == d) break;    }    int path[501];    for (i = d, j = 0; i >= 0; i = route[i], j++) {        path[j] = i;    }    for (i = 0; i < j; i++) {        printf("%d ", path[j - i - 1]);    }    printf("%d %d\n", ds[d], cs[d]);    return 0;}
0 0
原创粉丝点击