// 老刘's蓝宝书例题
#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
#define pb push_back
const int INF= 1000000000;
const int maxn = 505;
struct Edge{ int from,to,dist; };
struct HeapNode{
int d,u;
bool operator < (const HeapNode &rqt) const {
return d>rqt.d;
}
};
struct Dijkstra{
int n,m;
vector<Edge> edges;
vector<int> G[maxn];
bool exist[maxn];//判断
int d[maxn];//最短距离
int p[maxn];//记录前驱
void init(int n){
this -> n=n;
for(int i=0;i<n;i++) G[i].clear();
edges.clear();
}
void Add_Edge(int from,int to,int dist){
edges.pb((Edge){ from,to,dist });
m=edges.size();
G[from].pb((m-1));
}
void dijkstra(int s){
priority_queue<HeapNode> q;
for(int i=0;i<n;i++) d[i]=INF;
d[s]=0;
memset(exist,false,sizeof exist );
q.push((HeapNode){0,s});
while(!q.empty()){
HeapNode now=q.top();q.pop();
int u=now.u;
if(exist[u]) continue;
exist[u]=true;
for(int i=0;i<G[u].size();i++){
Edge& e=edges[G[u][i]] ;
if(d[e.to]>d[u]+e.dist){
d[e.to]=d[u]+e.dist;
p[e.to]=e.from;
q.push((HeapNode){d[e.to],e.to});
}
}
}
}
void get_pre(int s,int e,vector<int>& path){
int pos=e;
while(1){
path.pb(pos);
if(pos==s) break;
pos=p[pos];
}
}
};
int N,S,E;
vector<int> path;
Dijkstra solver[2];
int main(){
int time,ansp,ansq,kase=0;
while(scanf("%d%d%d",&N,&S,&E)!=EOF){
S--;E--;
if(kase!=0) printf("\n");
kase++;
solver[0].init(N);solver[1].init(N);
path.clear();
int M,K,X,Y,Z;
scanf("%d",&M);
while(M--){
scanf("%d%d%d",&X,&Y,&Z);X--;Y--;
solver[0].Add_Edge(X,Y,Z);
solver[1].Add_Edge(X,Y,Z);
solver[0].Add_Edge(Y,X,Z);
solver[1].Add_Edge(Y,X,Z);
}
solver[0].dijkstra(S);
solver[1].dijkstra(E);
ansp=-1;
time=solver[0].d[E];
scanf("%d",&K);
while(K--){
scanf("%d%d%d",&X,&Y,&Z);X--;Y--;
if(Z+solver[0].d[X]+solver[1].d[Y]<time){
time=Z+solver[0].d[X]+solver[1].d[Y];
ansp=X;ansq=Y;
}
if(Z+solver[0].d[Y]+solver[1].d[X]<time){
time=Z+solver[0].d[Y]+solver[1].d[X];
ansp=Y;ansq=X;
}
}
if(ansp==-1){
solver[0].get_pre(S,E,path);
reverse(path.begin(),path.end());
for(int i=0;i<path.size()-1;i++)
printf("%d ",path[i]+1);
printf("%d\n",E+1);
printf("Ticket Not Used\n");
printf("%d\n",time);
}
else{
solver[0].get_pre(S,ansp,path);
reverse(path.begin(),path.end());
solver[1].get_pre(E,ansq,path);
for(int i=0;i<path.size()-1;i++)
printf("%d ",path[i]+1);
printf("%d\n",E+1);
printf("%d\n",ansp+1);
printf("%d\n",time);
}
}
return 0;
}
第五十六题 UVa 11374 - Airport Express
猜你喜欢
转载自blog.csdn.net/qq_35776409/article/details/104041503
今日推荐
周排行