https://vjudge.net/problem/UVA-11374

题意:

机场快线分为经济线和商业线两种,线路、速度和价格都不同。你有一张商业线车票,可以坐一站商业线,而其他时候只能乘坐经济线。你的任务是找一条去机场最快的线路。

思路:

因为商业线只能坐一站,所有可以枚举坐的是哪一站,用dijkstra算出起点到每个点的最短时间f(x)和终点到每个点的最短时间g(x),则总时间为f(a)+T(a,b)+g(b),其中T(a,b)为从a坐一站商业线到达b的时间。

  1 #include <iostream>
  2 #include <cstring>
  3 #include <algorithm>
  4 #include <vector>
  5 #include <queue>
  6 using namespace std;
  7
  8 const int INF = 1000000000;
  9 const int maxn = 500 + 5;
 10
 11 struct Edge
 12 {
 13     int from, to, dist;
 14     Edge(int u, int v, int d) :from(u), to(v), dist(d){}
 15 };
 16
 17 struct HeapNode
 18 {
 19     int d, u;
 20     HeapNode(int x, int y) :d(x), u(y){}
 21     bool operator < (const HeapNode& rhs) const{
 22         return d > rhs.d;
 23     }
 24 };
 25
 26 struct Dijkstra
 27 {
 28     int n, m;                  //点数和边数
 29     vector<Edge> edges;        //边列表
 30     vector<int> G[maxn];       //每个结点出发的边编号(从0开始编号)
 31     bool done[maxn];           //是否已永久标号
 32     int d[maxn];               //s到各个点的距离
 33     int p[maxn];               //最短路中的上一条边
 34
 35     void init(int n)
 36     {
 37         this->n = n;
 38         for (int i = 0; i < n; i++)    G[i].clear();
 39         edges.clear();
 40     }
 41
 42     void AddEdges(int from, int to, int dist)
 43     {
 44         edges.push_back(Edge(from,to,dist));
 45         m = edges.size();
 46         G[from].push_back((m - 1));
 47     }
 48
 49     void dijkstra(int s)
 50     {
 51         priority_queue<HeapNode> Q;
 52         for (int i = 0; i < n; i++)    d[i] = INF;
 53         d[s] = 0;
 54         memset(done, 0, sizeof(done));
 55         Q.push(HeapNode(0,s));
 56         while (!Q.empty())
 57         {
 58             HeapNode x = Q.top(); Q.pop();
 59             int u = x.u;
 60             if (done[u]) continue;
 61             done[u] = true;
 62             for (int i = 0; i < G[u].size(); i++)
 63             {
 64                 Edge& e = edges[G[u][i]];
 65                 if (d[e.to] > d[u] + e.dist)
 66                 {
 67                     d[e.to] = d[u] + e.dist;
 68                     p[e.to] = e.from;
 69                     Q.push(HeapNode(d[e.to],e.to));
 70                 }
 71             }
 72         }
 73     }
 74
 75     void getpath(int s, int e, vector<int>& path)
 76     {
 77         int pos = e;
 78         while (true)
 79         {
 80             path.push_back(pos);
 81             if (pos == s)
 82                 break;
 83             pos = p[pos];
 84         }
 85     }
 86
 87 }t[2];
 88
 89 int N, S, E;
 90 vector<int> path;
 91
 92 int main()
 93 {
 94     //freopen("D:\\input.txt", "r", stdin);
 95     int time, kase = 0;
 96     while (scanf("%d%d%d", &N, &S, &E) != EOF)
 97     {
 98         S--; E--;
 99         if (kase != 0)   printf("\n");
100         kase++;
101         t[0].init(N);
102         t[1].init(N);
103         path.clear();
104         int M, K;
105         int u, v, d;
106         scanf("%d", &M);
107         while (M--)
108         {
109             scanf("%d%d%d", &u, &v, &d);
110             u--; v--;
111             t[0].AddEdges(u, v, d);
112             t[1].AddEdges(u, v, d);
113             t[0].AddEdges(v, u, d);
114             t[1].AddEdges(v, u, d);
115         }
116         t[0].dijkstra(S);
117         t[1].dijkstra(E);
118         int ks = -1, ke = -1;
119         time = t[0].d[E];
120         scanf("%d", &K);
121         while (K--)
122         {
123             scanf("%d%d%d", &u, &v, &d);
124             u--;v--;
125             if (d + t[0].d[u] + t[1].d[v] < time){
126                 time = d + t[0].d[u] + t[1].d[v];
127                 ks = u; ke = v;
128             }
129             if (d + t[0].d[v] + t[1].d[u] < time){
130                 time = d + t[0].d[v] + t[1].d[u];
131                 ks = v; ke = u;
132             }
133         }
134         if (ks == -1)
135         {
136             t[0].getpath(S, E, path);
137             reverse(path.begin(), path.end());
138             for (int i = 0; i < path.size() - 1; i++)
139                 printf("%d ", path[i]+1);
140             printf("%d\n", E+1);
141             printf("Ticket Not Used\n");
142             printf("%d\n", time);
143         }
144         else
145         {
146             t[0].getpath(S, ks, path);
147             reverse(path.begin(), path.end());
148             t[1].getpath(E, ke, path);
149             for (int i = 0; i < path.size() - 1; i++)
150                 printf("%d ", path[i]+1 );
151             printf("%d\n", E+1);
152             printf("%d\n", ks + 1);
153             printf("%d\n", time);
154         }
155     }
156     return 0;
157 }

转载于:https://www.cnblogs.com/zyb993963526/p/6663953.html

UVa 11374 机场快线相关推荐

  1. Uva 11374 - Airport Express(枚举+最短路)

    题目链接 https://vjudge.net/problem/UVA-11374 [题意] 市民从市区去机场要走机场快线,机场快线分为经济线和商业线两种,你只有一张商业线车票,只能坐一站商业线,其它 ...

  2. uva 11374(Dijkstra) HappyNewYear!!!

    2013年最后一题,也是最后一篇随笔~祝大家新年快乐! 题意:在一张无向图中, 有两种公交线路,快线和慢线.现在有一个人想要从s->e但是他只有一张快线车票.所以快线只能乘坐一次,慢线可以随便乘 ...

  3. UVa 11374 - Airport Express

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  4. 珠海到各大机场的线路

    珠海到各大机场的线路 往珠海机场 一.207路公交车  香洲总站----珠海机场:6:20-18:40 珠海机场----香洲总站:6:40-19:00   车程:全程约1:40分钟,每隔24分钟一班次 ...

  5. 与北京相比较而言,杭州能不能挺进“一线”,还得看未来科技城---云城,第二机场入住云城周边是神助攻

    杭州第二机场选址的三个备选方案仁和.瓶窑.塘栖中选择瓶窑的理由.元芳,你怎么看? 关于杭州将往哪去?未来到底是拥江一家独大,还是武林.湖滨重生?亦或是城西崛起?三国争霸,短期内注定是拥江和城西齐头并进 ...

  6. 香港机场到市区,更方便更便宜的路线

    第一次去香港,按照网络上的攻略提前购买了八达通,一下飞机就直接去做机场快线,从机场到青衣,就一站,扣费66,我的天啊,这么贵,,接下来又换成了两条地铁线,最后在油麻地出战,竟然莫名的没有扣费,一直费解 ...

  7. 主板噪音测试软件,工作噪音测试 - 三英战吕布?四款300元热门电源横评 - 超能网...

    ◆ 工作噪音测试(Operation Noise Test) 噪音的标准是根据听力正常的人能听到的最小声音而定,0分贝为刚好能听到的声音,每增加10分贝等于强度增强10倍,增加20.30分贝则为100 ...

  8. 算法竞赛入门经典 写题笔记(第五章 图论算法与模型2)

    本节内容-- 2-SAT dijstra算法的一些应用 SPFA算法的一些应用 例题9 飞机调度 有n架飞机需要着陆.每架飞机都可以选择"早着陆"和"晚着陆"两 ...

  9. 超励志!从中专生到教授,他32岁成为国家杰青!

    出身,背景对一个人重要吗?重要,但今天的主人公至少告诉我们,这绝不应该成为阻碍你优秀的理由. >>>> 上世纪90年代,东北一家工厂内,一位工人正在机床旁读书.书本上沾满了机床 ...

最新文章

  1. 【bzoj2460】[BeiJing2011]元素 贪心+高斯消元求线性基
  2. python图形界面教程_图形教程
  3. 计算机卡在无法显示网页,我的电脑上网上银行一直“无法显示网页”
  4. linux的驱动开发——设备号
  5. 人工智能与大数据的完美结合 1
  6. esp8266原理图_ESP8266_22基于自身ADC的电压采样
  7. Strust2 本地化/国际化
  8. 【OpenCV】图像旋转详解,边缘用黑色填充
  9. 我国常用的微型计算机是,2013云南省全国计算机等级考试二级笔试试卷VB理论考试试题及答案...
  10. Linq to xml修改CDATA节点值
  11. 《深入浅出数据分析》读后详解
  12. 彗星撞地球-Warez组织的经典力作(15G动画压缩成64Kb的那个,2004年的第一名)
  13. 雷电模拟器android文件夹在哪,雷电安卓模拟器共享文件怎么用?电脑文件与模拟器互通图文教程...
  14. Php替换公众号图片替换,公众号文章发布后可以替换图片吗?公众号发出去的图片怎么替换?...
  15. ESP32内部ADC最大采样率真的能达到2MSPS吗?答案是不能。
  16. deepin系统更新node
  17. 使用watermark.js给HTML、Word、PPT、Excel等添加水印
  18. linux系统解压缩命令大全
  19. 教师节祝福语太单调?来用PaddleHub生成独家祝福语
  20. boll指标(布林带)计算公式

热门文章

  1. Mathematics for Computer Graphics
  2. /hbase/WALs/desktop,xxxxxxxx-splitting is non empty: Directory is not empty
  3. kaggle删除自己的数据集
  4. Semaphore用法
  5. 复制的时候提示下标越界_移动硬盘打不开提示格式化怎么办?
  6. Hadoop, Hbase
  7. 【机器学习】传统目标检测算法之DPM
  8. 17:附近最大的城市
  9. 一个nuxt(vue)+mongoose全栈项目聊聊我粗浅的项目架构
  10. Python 使用 itchat+pillow 实现微信消息自动回复