日期:2023.10.18
第9天
题目来源:patA1030
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAXN = 510;
const int INF = 0x3f3f3f3f;
int n, m, s, d;
int G[MAXN][MAXN];
int cost[MAXN][MAXN]; //边的第二标尺
int totalCost[MAXN] = {0}; //每个点到起点的距离
bool vis[MAXN] = {0};
int dijk[MAXN];
int pre[MAXN];
void Dijkstra(int s) {
memset(dijk, 0x3f, sizeof(dijk));
dijk[s] = 0;
//每个点的前驱结点设置为自己
for(int i = 0; i < n; i++) {
pre[i] = i;
}
for(int i = 0; i < n; i++) {
//三步走
int u = -1, MIN = INF;
for(int j = 0; j < n; j++) {
if(vis[j] == 0 && dijk[j] < MIN) {
u = j;
MIN = dijk[j];
}
}
if(u == -1) return ;
vis[u] = 1;
for(int v = 0; v < n; v++) {
if(G[u][v] != INF && vis[v] == 0) {
if(dijk[u] + G[u][v] < dijk[v]) {
pre[v] = u;
dijk[v] = dijk[u] + G[u][v];
totalCost[v] = totalCost[u] + cost[u][v];
}
else if(dijk[u] + G[u][v] == dijk[v]) {
//根据第二标尺,决定是否更换前驱路径
if(totalCost[u] + cost[u][v] < totalCost[v]) {
totalCost[v] = totalCost[u] + cost[u][v];
pre[v] = u;
}
}
}
}
}
}
void DFS(int v) {
if(v == s) {
printf("%d ", v);
return ;
}
else {
DFS(pre[v]);
printf("%d ", v);
}
}
int main(void) {
scanf("%d%d%d%d", &n, &m, &s, &d);
memset(G, 0x3f, sizeof(G));
for(int i = 0; i < m; i++) {
int v1, v2, dis, cos;
scanf("%d%d%d%d", &v1, &v2, &dis, &cos);
G[v1][v2] = G[v2][v1] = dis;
cost[v1][v2] = cost[v2][v1] = cos;
}
Dijkstra(s);
//输出路径
DFS(d);
printf("%d %d ", dijk[d], totalCost[d]);
return 0;
}
问题:
1.把昨天的题又重新做了一遍。因为 只涉及到简单的第二标尺,可以直接在Dijkstra()里面求出第二尺度最优值。
2.因为输出多加了个空格,报错显示格式错误,却一直以为是自己的代码又语法错误的地方。。。