预处理单源最短路径,计算到s,e的最短路径d[s],d[e],然后枚举所有商务线,两点为u,v,边长cos,则走商务线最短路径是ds[s]+cos+de[e]..
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
const int maxn = 2010;
const int INF = 0x3f3f3f3f;
struct Edge {
int from,to,dist;
} edges[maxn*2];
int dis[maxn],dis_s[maxn];
int pre[maxn],pre_s[maxn];
bool done[maxn];
vector<int> G[maxn];
int index_;
int n,s,e;
int m,k;
struct Node {
int u,d;
bool operator < (const Node &n) const {
return d > n.d;
}
};
void add_edge(int from,int to,int dist) {
G[from].push_back(index_);
edges[index_++] = (Edge){from,to,dist};
}
void dijkstra(int s) {
priority_queue<Node> q;
for(int i = 0;i < maxn;i++) dis[i] = INF;
memset(done,0,sizeof(done));
memset(pre,0,sizeof(pre));
q.push((Node){s,0});
dis[s] = 0;
pre[s] = -1;
while(!q.empty()) {
Node cur = q.top();
q.pop();
if(done[cur.u]) continue;
done[cur.u] = true;
for(int i = 0;i < G[cur.u].size();i++) {
Edge e = edges[G[cur.u][i]];
if(dis[e.to] > dis[cur.u]+e.dist) {
dis[e.to] = dis[cur.u]+e.dist;
pre[e.to] = cur.u;
q.push((Node){e.to,dis[e.to]});
}
}
}
}
void dfs(int e,int s) {
if(e == s) {
printf("%d",s);
return;
}
dfs(pre_s[e],s);
printf(" %d",e);
}
void dfs_(int e,int s) {
while(true) {
printf("%d",s);
if(s==e) {
printf("\n");
break;
} else {
printf(" ");
}
s = pre[s];
}
}
Edge t[maxn*2];
int main() {
// freopen("out.txt","w",stdout);
int kase = 1;
while(scanf("%d%d%d",&n,&s,&e) != EOF) {
if(kase++ != 1) printf("\n");
for(int i = 0;i < n;i++) G[i].clear();
memset(done,0,sizeof(done));
for(int i = 0;i < maxn;i++) dis[i] = INF;
index_ = 0;
scanf("%d",&m);
int x,y,z;
for(int i = 0;i < m;i++) {
scanf("%d%d%d",&x,&y,&z);
add_edge(x,y,z);
add_edge(y,x,z);
}
dijkstra(s);
memcpy(dis_s,dis,sizeof(dis));
memcpy(pre_s,pre,sizeof(pre));
dijkstra(e);
scanf("%d",&k);
int t_n = 0;
memset(t,0,sizeof(t));
for(int i = 0;i < k;i++) {
scanf("%d%d%d",&x,&y,&z);
t[t_n++] = (Edge){x,y,z};
t[t_n++] = (Edge){y,x,z};
}
int res = dis[s];
bool used = false;
int station1 = -1;
int station2 = -1;
for(int i = 0;i < t_n;i++) {
Edge e = t[i];
if(res > dis_s[e.from]+t[i].dist+dis[e.to]) {
used = true;
res = dis_s[e.from]+t[i].dist+dis[e.to];
station1 = e.from;
station2 = e.to;
}
}
if(!used) {
dfs(e,s);
printf("\n");
printf("Ticket Not Used\n");
printf("%d\n",res);
} else {
dfs(station1,s);
printf(" ");
dfs_(e,station2);
printf("%d\n",station1);
printf("%d\n",res);
}
}
return 0;
}