题目分析
我们可以从S出发算法最短路,然后从E出发算出最短路,然后枚举每一条特殊通道即可。输出可能有些麻烦。
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1e4+100;
const int INF = 0x3f3f3f3f;
int N, S, E, M;
int d1[maxn], d2[maxn], vis[maxn];
int head[maxn], tot;
struct Edge{
int to, next, val;
}e[maxn<<1];
void spfa(int S, int d[]){
for(int i = 0; i < maxn; i++) d[i] = INF;
memset(vis, 0, sizeof(vis));
queue <int> q;
q.push(S);
vis[S] = 1;
d[S] = 0;
while(!q.empty()){
int u = q.front(); q.pop();
vis[u] = 0;
for(int i = head[u]; i != -1; i = e[i].next){
int v = e[i].to;
if(d[v] > d[u] + e[i].val){
d[v] = d[u] + e[i].val;
if(!vis[v]){
q.push(v);
vis[v] = 1;
}
}
}
}
}
void addedge(int from, int to, int val){
e[tot].to = to;
e[tot].val = val;
e[tot].next = head[from];
head[from] = tot++;
}
void init(){
tot = 0;
memset(head, -1, sizeof(head));
}
void print1(int u, int d[]){
for(int i = head[u]; i != -1; i = e[i].next){
int v = e[i].to;
if(d[u] == d[v] + e[i].val){
print1(v, d);
break;
}
}
if(u == E) printf("%d\n", u);
else printf("%d ", u);
}
void print2(int u, int d[]){
if(u == E) printf("%d\n", u);
else printf("%d ", u);
for(int i = head[u]; i != -1; i = e[i].next){
int v = e[i].to;
if(d[u] == d[v] + e[i].val){
print2(v, d);
break;
}
}
}
void solve(int f, int t){
if(f == -1){
print1(E, d1);
printf("Ticket Not Used\n");
return ;
}
print1(f, d1);
print2(t, d2);
printf("%d\n", f);
}
int main(){
#ifdef LOCAL
freopen("input.txt", "r", stdin);
#endif // LOCAL
int first = 0;
while(scanf("%d%d%d", &N, &S, &E) != EOF){
if(first) printf("\n");
else first = 1;
init();
int from, to, val;
scanf("%d", &M);
for(int i = 0; i < M; i++){
scanf("%d%d%d", &from, &to, &val);
addedge(from, to, val);
addedge(to, from, val);
}
spfa(S, d1);
spfa(E, d2);
scanf("%d", &M);
int ans = d1[E];
int f = -1, t = -1;
for(int i = 0; i < M; i++){
scanf("%d%d%d", &from, &to, &val);
if(d1[from]+val+d2[to] < ans){
ans = d1[from]+val+d2[to];
f = from, t = to;
}
if(d1[to]+val+d2[from] < ans){
ans = d1[to]+val+d2[from];
f = to, t = from;
}
}
solve(f, t);
printf("%d\n", ans);
}
return 0;
}