UVA 11374 Airport Express(最短路+列舉)
阿新 • • 發佈:2019-01-22
題目大意:機場快線分為經濟線和商業線,線路和價錢都不同。只能坐一次商業線,經濟線可以隨便坐,給出起點和終點,求出去終點最快的那條路的路徑,時間,如果乘坐了商業線,就輸出商業線的起點
最短路
先假設我們要乘坐商業線,那麼我們就可以將路徑分為起點到a點,a點到b點(商業線),b點到終點,所以我們先求一遍從七點出發的最短路,再求一遍從終點出發的最短路,列舉商業線,若能求得答案則輸出路徑。若沒有商業線符合要求,則就是普通的最短路
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<vector> using namespace std; const int inf=0x3f3f3f3f; const int maxn=510; const int maxm=2e3+7; typedef pair<int,int> P; struct Node { int to; int val; int next; }edge[maxm<<1]; int cnt; int head[maxn]; int dis_from_start[maxn]; int dis_from_end[maxn]; int pre_from_start[maxn]; int pre_from_end[maxn]; void init() { memset(head,-1,sizeof(head)); memset(pre_from_start,-1,sizeof(pre_from_start)); memset(pre_from_end,-1,sizeof(pre_from_end)); memset(dis_from_start,inf,sizeof(dis_from_start)); memset(dis_from_end,inf,sizeof(dis_from_end)); cnt=0; return; } void add(int u,int v,int w) { edge[cnt].to=v; edge[cnt].val=w; edge[cnt].next=head[u]; head[u]=cnt++; return; } void dijkstra(int x,int *dis,int *pre) { priority_queue<P,vector<P>,greater<P> > que; dis[x]=0; que.push(make_pair(0,x)); while(!que.empty()) { P now=que.top(); que.pop(); int node=now.second; int now_dis=now.first; if(dis[node]<now_dis) continue; for(int i=head[node];~i;i=edge[i].next) { int v=edge[i].to; if(dis[v]>dis[node]+edge[i].val) { dis[v]=dis[node]+edge[i].val; pre[v]=node; que.push(make_pair(dis[v],v)); } } } return; } int main() { //freopen("in.txt","r",stdin); int n,s,e; int cas=0; while(~scanf("%d%d%d",&n,&s,&e)) { init(); int m; scanf("%d",&m); for(int i=0;i<m;i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w); add(u,v,w); add(v,u,w); } dijkstra(s,dis_from_start,pre_from_start); dijkstra(e,dis_from_end,pre_from_end); int ans=dis_from_start[e]; int source=-1,sink=-1; scanf("%d",&m); for(int i=0;i<m;i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w); int res=dis_from_start[u]+dis_from_end[v]+w; if(ans>res) { ans=res; source=u; sink=v; } res=dis_from_start[v]+dis_from_end[u]+w; if(ans>res) { source=v; sink=u; ans=res; } } if(cas) cout<<endl; else cas++; if(source!=-1) { int ans_source=source; vector<int> ans; while(source!=-1) { ans.push_back(source); source=pre_from_start[source]; } int len=ans.size(); for(int i=len-1;i>=0;i--) { cout<<ans[i]<<' '; } ans.clear(); while(sink!=-1) { ans.push_back(sink); sink=pre_from_end[sink]; } len=ans.size(); for(int i=0;i<len-1;i++) { cout<<ans[i]<<' '; } cout<<ans[len-1]<<endl; cout<<ans_source<<endl; } else { vector<int> ans; while(e!=-1) { ans.push_back(e); e=pre_from_start[e]; } int len=ans.size(); for(int i=len-1;i>=1;i--) { cout<<ans[i]<<' '; } cout<<ans[0]<<endl; cout<<"Ticket Not Used"<<endl; } cout<<ans<<endl; } return 0; }