Airport Express UVA - 11374(dijkstra)

Posted yijiull

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Airport Express UVA - 11374(dijkstra)相关的知识,希望对你有一定的参考价值。

Airport Express

 UVA - 11374

题意:n个点,有m条普通路径,k条高速路径,但是k条只能选一条走。问从s到e最短时间。

如果选a-->b这条高速,那么s-->a和b--->e必然也要是最短路。

于是我们可以先用两次dijkstra预处理出s到各点的最短路和e到各点的最短路,然后枚举k条高速走哪条。

输出路径的时候,可以递归~

技术分享
  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 const int inf=0x3f3f3f3f;
  4 const int maxv=1010;
  5 const int maxe=1010;
  6 
  7 struct Edge
  8 {
  9     int u,v,w;
 10     int nex;
 11 }e[maxe<<1];
 12 int head[maxv];
 13 int cnt=0;
 14 void init()
 15 {
 16     memset(head,-1,sizeof(head));
 17     cnt=0;
 18 }
 19 void add(int u,int v,int w)
 20 {
 21     e[cnt].u=u;
 22     e[cnt].v=v;
 23     e[cnt].w=w;
 24     e[cnt].nex=head[u];
 25     head[u]=cnt++;
 26 }
 27 
 28 typedef pair<int,int> PII;
 29 int dis[maxv];
 30 int par[maxv];
 31 void dijkstra(int s)
 32 {
 33     priority_queue<PII,vector<PII>,greater<PII> > pq;
 34     for(int i=0;i<maxv;i++) dis[i]=inf;
 35     dis[s]=0;
 36     pq.push(PII(0,s));
 37     while(!pq.empty())
 38     {
 39         PII temp=pq.top();
 40         pq.pop();
 41         int u=temp.second;
 42         if(dis[u]<temp.first) continue;
 43         for(int i=head[u];i!=-1;i=e[i].nex)
 44         {
 45             if(dis[e[i].v]>dis[u]+e[i].w)
 46             {
 47                 dis[e[i].v]=dis[u]+e[i].w;
 48                 par[e[i].v]=i;
 49                 pq.push(PII(dis[e[i].v],e[i].v));
 50             }
 51         }
 52     }
 53 }
 54 int n,ss,ee;
 55 int ds[maxv],de[maxv];
 56 int p[maxv],p1[maxv];
 57 
 58 void print(int a)
 59 {
 60     if(a==ss)
 61     {
 62         printf("%d",a+1);
 63     }
 64     else
 65     {
 66         int x=p1[a];
 67         print(e[x].u);
 68         printf(" %d",a+1);
 69     }
 70     return ;
 71 }
 72 
 73 int main()
 74 {
 75     int kase=0;
 76 
 77     while(scanf("%d%d%d",&n,&ss,&ee)!=EOF&&n)
 78     {
 79         if(kase++) puts("");
 80         ss--;ee--;
 81         init();
 82         int u,v,w;
 83         int m;
 84         scanf("%d",&m);
 85         for(int i=0;i<m;i++)
 86         {
 87             scanf("%d%d%d",&u,&v,&w);
 88             u--,v--;
 89             add(u,v,w);
 90             add(v,u,w);
 91         }
 92         dijkstra(ss);
 93         for(int i=0;i<n;i++) {ds[i]=dis[i];p1[i]=par[i];}
 94         pa[ss]=-1;
 95         dijkstra(ee);
 96         for(int i=0;i<n;i++) {de[i]=dis[i];p[i]=par[i];}
 97         p[ee]=-1;
 98 
 99 
100         int ans1=ds[ee];
101         int a=-1,b=-1;
102         int k;
103         scanf("%d",&k);
104         for(int i=0;i<k;i++)
105         {
106             scanf("%d%d%d",&u,&v,&w);
107             u--;v--;
108             if(ans1>ds[u]+w+de[v])
109             {
110                 ans1=ds[u]+w+de[v];
111                 a=u,b=v;
112             }
113             if(ans1>ds[v]+w+de[u])
114             {
115                 ans1=ds[v]+w+de[u];
116                 a=v,b=u;
117             }
118         }
119 
120         int flag=0;
121         if(a==-1)
122         {
123             int x=ss;
124             while(x!=ee)
125             {
126                 if(!flag){printf("%d",x+1);flag=1;}
127                 else printf(" %d",x+1);
128                 x=e[p[x]].u;
129             }
130             printf(" %d\n",ee+1);
131             printf("Ticket Not Used\n%d\n",ans1);
132         }
133         else
134         {
135             print(a);
136             int x=b;
137             while(x!=ee)
138             {
139                 printf(" %d",x+1);
140                 x=e[p[x]].u;
141             }
142             printf(" %d\n",ee+1);
143             printf("%d\n%d\n",a+1,ans1);
144         }
145     }
146     return 0;
147 }
View Code

 

以上是关于Airport Express UVA - 11374(dijkstra)的主要内容,如果未能解决你的问题,请参考以下文章

UVA11374 Airport Express

UVA11374 Airport Express

UVA11374 Airport Express

Airport Express UVA - 11374(dijkstra)

Airport Express UVA - 11374

UVA 11374 - Airport Express(最短路)