#include <stdio.h>
#define MAX 9999999
typedef 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;
}
【PAT甲级】1030. Travel Plan (30)
最新推荐文章于 2021-09-06 16:16:20 发布