1030 Travel Plan (30point(s)) 需要二看 *看一看,最短路径没前面几道难
基本思想:
附带路径代价的最短路径生成;
关键点:
无;
#include<iostream>
#include<fstream>
#include<sstream>
#include<vector>
#include<string>
#include<cstring>
#include<algorithm>
#include<math.h>
#include<string.h>
using namespace std;
const int maxn = 510;
const int INF = 100000;
int n, m, s, d;
int ma[maxn][maxn];
int weight[maxn][maxn];
bool vis[maxn];
int dis[maxn];
int w[maxn];
int pre[maxn];
void dij(int st) {
fill(vis, vis + maxn, true);
fill(dis, dis + maxn, INF);
fill(w, w + maxn, INF);
for (int i = 0; i < n; i++) {
pre[i] = i;
}
dis[st] = 0;
w[st] = 0;
for (int i = 0; i < n; i++) {
int index = -1;
int min = INF;
for (int j = 0; j < n; j++) {
if (vis[j] && dis[j] < min) {
min = dis[j];
index = j;
}
}
if (index == -1)
return;
vis[index] = false;
for (int j = 0; j < n; j++) {
if (vis[j] && ma[index][j] != INF) {
if (dis[j] > ma[index][j] + dis[index]) {
dis[j] = ma[index][j] + dis[index];
w[j] = weight[index][j] + w[index];
pre[j] = index;
}
else if (dis[j] == ma[index][j] + dis[index]) {
if (w[j] > weight[index][j] + w[index]) {
//如果更小;
w[j] = weight[index][j] + w[index];
pre[j] = index;
}
}
}
}
}
}
void dfs(int v) {
if (pre[v] != v)
dfs(pre[v]);
printf("%d ", v);
}
int main(){
fill(weight[0], weight[0] + maxn*maxn, 0);
fill(ma[0], ma[0] + maxn*maxn, INF);
cin >> n >> m >> s >> d;
int a, b;
for (int i = 0; i < m; i++) {
cin >> a >> b;
cin >> ma[a][b] >> weight[a][b];
ma[b][a] = ma[a][b];
weight[b][a] = weight[a][b];
}
dij(s);
dfs(d);
printf("%d ", dis[d]);
printf("%d", w[d]);
return 0;
}

浙公网安备 33010602011771号