第五十六题 UVa 11374 - Airport Express

在这里插入图片描述

// 老刘'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;
}

发布了732 篇原创文章 · 获赞 31 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/qq_35776409/article/details/104041503
今日推荐