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 }

时间: 2024-10-16 11:47:20

Airport Express UVA - 11374(dijkstra)的相关文章

训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板)

layout: post title: 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板) author: "luowentaoaa" catalog: true mathjax: true tags: - 最短路 - Dijkstra - 图论 - 训练指南 Airport Express UVA - 11374 题意 机场快线有经济线和商业线,现在分别给出经济线和商业线的的路线,现在只能坐一站商业线,其他坐经济线,问从起点到终点的最短用时是多少,还有

最短路径算法——迪杰斯特拉算法(Dijkstra)

图结构中应用的最多的就是最短路径的查找了,关于最短路径查找的算法主要有两种:迪杰斯特拉算法(Dijkstra)和Floyd算法. 其中迪杰斯特拉算法(Dijkstra)实现如下: 原理就是不断寻找当前的最优解: void main() { int V[Max][Max]={0,8,32,Infinity,Infinity, 12,0,16,15,Infinity, Infinity,29,0,Infinity,13, Infinity,21,Infinity,0,7, Infinity,Infi

hdu 1874(Dijkstra )

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 27692    Accepted Submission(s): 10019 Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路

poj1062昂贵的聘礼(Dijkstra**)

1 /* 2 题意: 物主有一个物品,价值为P,地位为L, 以及一系列的替代品Ti和该替代品所对应的"优惠"Vi 3 g[u][i] 表示的是u物品被i物品替换后的优惠价格!(u>0, i>0) 4 g[u][0]表示不用替换该物品的实际价格 ! 5 d[0]表示的是第一个物品经过一系列的物品替换之后的最少优惠价格! 6 7 思路:每当我们通过Dijkstra算法得到离源点(1)最近的距离的节点 p的时候(也就是1...pre[p], p)这条 8 路径上的物品互相替换后得

迪杰斯特拉(dijkstra)算法的简要理解和c语言实现(源码)

迪杰斯特拉(dijkstra)算法:求最短路径的算法,数据结构课程中学习的内容. 1 . 理解 算法思想::设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将 加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中.在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v

hdu 2066 一个人的旅行(Dijkstra)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2066 Problem Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还可以看美丽的风景--草儿想去很多地方,她想要去东京铁塔看夜景,去威尼斯看电影,去阳明山上看海芋,去纽约纯粹看雪景,去巴黎喝咖啡写信,去北京探望孟姜女--眼看寒假就快到了,这么一大段

算法-迪杰斯特拉算法(dijkstra)-最短路径

迪杰斯特拉算法(dijkstra)-最短路径 简介: 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 算法思想: 设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中

poj 1122 FDNY to the Rescue! (dijkstra)

FDNY to the Rescue! Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2475   Accepted: 755 Description The Fire Department of New York (FDNY) has always been proud of their response time to fires in New York City, but they want to make the

单源最短路径(Dijkstra)——贪心算法

Dijkstra算法是解单源最短路径问题的贪心算法.其基本思想是,设置顶点集合点集合S并不断地做贪心选择来扩充这个集合.一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知.初始时,S中仅含有源.设u是G的其一顶点.把从源到u且中间只经过S中顶点的路称为从源到u的特殊路径,并用数组Distance记录当前每个顶点所对应的最短特殊路径长度.Dijkstra算法每次从V-S中取出具有最短特殊路长度的顶占,Distance就记录了从源到所有其它顶点之间最短路径长度. 例如下图中的有向图,应用Dij