1111 Online Map (30 分)
思路有空更新
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
const int inf = 0x3f3f3f3f;
vector<int> p1, p2;
int map1[550][550], map2[550][550], vis[550], dis[550], fast[550], cnt[550];
int n, m, s, d, path1[550], path2[550];
void dijkstra1() {
memset(dis, inf, sizeof dis);
dis[s] = 0;
for(int i = 0; i < n; ++i) {
int t = -1;
for(int j = 0; j < n; ++j)
if(!vis[j] && (t == -1 || dis[j] < dis[t]))
t = j;
vis[t] = 1;
for(int j = 0; j < n; ++j) {
if(!vis[j] && dis[j] > dis[t] + map1[t][j]){
dis[j] = dis[t] + map1[t][j];
fast[j] = fast[t] + map2[t][j];
path1[j] = t;
}
else if(!vis[j] && dis[j] == dis[t] + map1[t][j]){
if(fast[j] > fast[t] + map2[t][j]){
fast[j] = fast[t] + map2[t][j];
path1[j] = t;
}
}
}
}
}
void dijkstra2() {
memset(vis, 0, sizeof vis);
memset(fast, inf, sizeof fast);
fast[s] = 0;
for(int i = 0; i < n; ++i) {
int t = -1;
for(int j = 0; j < n; ++j)
if(!vis[j] && (t == -1 || fast[j] < fast[t]))
t = j;
vis[t] = 1;
for(int j = 0; j < n; ++j) {
if(!vis[j] && fast[j] > fast[t] + map2[t][j]){
fast[j] = fast[t] + map2[t][j];
cnt[j] = cnt[t] + 1;
path2[j] = t;
}
else if(!vis[j] && fast[j] == fast[t] + map2[t][j] && cnt[j] > cnt[t] + 1){
cnt[j] = cnt[t] + 1;
path2[j] = t;
}
}
}
}
int main() {
cin >> n >> m;
memset(map1, inf, sizeof map1);
memset(map2, inf, sizeof map2);
for(int i = 0; i < n; ++i)
map1[i][i] = map2[i][i] = 0;
while(m--) {
int v1, v2, x, y, z;
cin >> v1 >> v2 >> x >> y >> z;
if(x == 0){
map1[v1][v2] = map1[v2][v1] = y;
map2[v1][v2] = map2[v2][v1] = z;
}
else{
map1[v1][v2] = y;
map2[v1][v2] = z;
}
}
cin >> s >> d;
dijkstra1();
dijkstra2();
int x = d, f = 1;
while(x != s) {
p1.push_back(x);
x = path1[x];
}
x = d;
while(x != s) {
p2.push_back(x);
x = path2[x];
}
if(p1.size() != p2.size()) f = 0;
else{
for(int i = 0; i < p1.size(); ++i)
if(p1[i] != p2[i]) f = 0;
}
if(f){
printf("Distance = %d; Time = %d: %d", dis[d], fast[d], s);
for(int i = p1.size() - 1; i >= 0; --i)
printf(" -> %d", p1[i]);
}
else{
printf("Distance = %d: %d", dis[d], s);
for(int i = p1.size() - 1; i >= 0; --i)
printf(" -> %d", p1[i]);
printf("\nTime = %d: %d", fast[d], s);
for(int i = p2.size() - 1; i >= 0; --i)
printf(" -> %d", p2[i]);
}
}