• UVA11374 Airport Express


    题目大意:

    在Iokh市中,机场快线是市民从市内去机场的首选交通工具。机场快线分为经济线和商业线两种,线路,速度和价钱都不同。你有一张商业线车票,可以做一站商业线,而其他时候只能乘坐经济线。假设换乘时间忽略不计,你的任务是找一条去机场最快的路线(翻译来源:https://www.cnblogs.com/arbitrary/archive/2013/02/06/2908099.html)

    题解:

    预处理最短路,枚举商业线即可

    PE了很久。。。郁闷。。

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cstring>
      4 #include <cstdlib>
      5 #include <algorithm>
      6 #include <queue>
      7 #include <vector>
      8 #include <map>
      9 #include <string> 
     10 #include <cmath> 
     11 #define min(a, b) ((a) < (b) ? (a) : (b))
     12 #define max(a, b) ((a) > (b) ? (a) : (b))
     13 #define abs(a) ((a) < 0 ? (-1 * (a)) : (a))
     14 template<class T>
     15 inline void swap(T &a, T &b)
     16 {
     17     T tmp = a;a = b;b = tmp;
     18 }
     19 inline void read(int &x)
     20 {
     21     x = 0;char ch = getchar(), c = ch;
     22     while(ch < '0' || ch > '9') c = ch, ch = getchar();
     23     while(ch <= '9' && ch >= '0') x = x * 10 + ch - '0', ch = getchar();
     24     if(c == '-') x = -x;
     25 }
     26 const int INF = 0x3f3f3f3f;
     27 const int MAXN = 500 + 10;
     28 const int MAXM = 1000 + 10;
     29 struct Edge
     30 {
     31     int u,v,w,nxt;
     32     Edge(int _u, int _v, int _w, int _nxt){u = _u;v = _v;w = _w;nxt = _nxt;}
     33     Edge(){}
     34 }edge[MAXM << 1];
     35 int head[MAXN], cnt, dis1[MAXN], dis2[MAXN], vis[MAXN];
     36 inline void insert(int a, int b, int c){edge[++ cnt] = Edge(a,b,c,head[a]), head[a] = cnt;}
     37 struct Node
     38 {
     39     int u,w;
     40     Node(int _u, int _w){u = _u, w = _w;}
     41     Node(){}
     42 };
     43 struct cmp
     44 {
     45     bool operator()(Node a, Node b)
     46     {
     47         return a.w > b.w;
     48     }    
     49 };
     50 std::priority_queue<Node, std::vector<Node>, cmp> q;
     51 void dij(int S, int *d, int size)
     52 {    
     53     while(q.size()) q.pop();
     54     memset(d, 0x3f, size), memset(vis, 0, sizeof(vis)), d[S] = 0, q.push(Node(S, 0));
     55     while(q.size())
     56     {
     57         Node now = q.top();q.pop();
     58         if(vis[now.u]) continue;
     59         vis[now.u] = 1;
     60         for(int pos = head[now.u];pos;pos = edge[pos].nxt)
     61         {
     62             int v = edge[pos].v;
     63             if(vis[v]) continue;
     64             if(d[v] > d[now.u] + edge[pos].w) d[v] = d[now.u] + edge[pos].w, q.push(Node(v, d[v]));
     65         }
     66     }
     67 }
     68 int n,s,t,m,ans1,u,v,w,k,tmp1,tmp2,tmp3,ans,from,to,flag,stack[MAXN],top;
     69 void dfs(int u, int t, int *d)
     70 {
     71     if(u == t)
     72     {
     73         stack[++ top] = u, flag = 1;return;
     74     }
     75     for(int pos = head[u];pos;pos = edge[pos].nxt)
     76     {
     77         int v = edge[pos].v;
     78         if(d[v] == d[u] + edge[pos].w) dfs(v, t, d);
     79         if(flag)
     80         {
     81             stack[++ top] = u;
     82             return;
     83         }
     84     }
     85 }
     86 int main()
     87 {
     88     int ttt = 0;
     89     while(scanf("%d %d %d %d", &n, &s, &t, &m) != EOF)
     90     {
     91         if(ttt) putchar('
    ');ttt = 1;
     92         memset(head, 0, sizeof(head)), cnt = 0, ans = INF, from = to = 0;
     93         for(int i = 1;i <= m;++ i) read(tmp1), read(tmp2), read(tmp3), insert(tmp1, tmp2, tmp3), insert(tmp2, tmp1, tmp3);
     94         dij(s, dis1, sizeof(dis1)), dij(t, dis2, sizeof(dis2)), read(k);
     95         ans = dis1[t];
     96         for(int i = 1;i <= k;++ i) 
     97         {
     98             read(u), read(v), read(w);
     99             if(ans > dis1[u] + w + dis2[v]) ans = dis1[u] + w + dis2[v], from = u, to = v;
    100             if(ans > dis1[v] + w + dis2[u]) ans = dis1[v] + w + dis2[u], from = v, to = u;
    101         }
    102         if(ans == dis1[t])
    103         {
    104             flag = top = 0, dfs(s, t, dis1);
    105             int tt = 0;
    106             for(int i = top;i >= 1;-- i) 
    107                 if(!tt) printf("%d", stack[i]), tt = 1;
    108                 else printf(" %d", stack[i]);
    109             printf("
    Ticket Not Used
    ");
    110             printf("%d
    ", dis1[t]);
    111             continue;
    112         }
    113         flag = top = 0, dfs(s, from, dis1);
    114         int tt = 0;
    115         for(int i = top;i >= 1;-- i)
    116             if(!tt) printf("%d", stack[i]), tt = 1;
    117             else printf(" %d", stack[i]);
    118         flag = top = 0, dfs(t, to, dis2);
    119         for(int i = 1;i <= top;++ i) 
    120             if(!tt) printf("%d", stack[i]), tt = 1;
    121             else printf(" %d", stack[i]);
    122         printf("
    %d
    %d
    ", from, ans);
    123     }
    124     return 0;
    125 }
    UVA11374
  • 相关阅读:
    算法导论第十三章:红黑树
    算法导论:相关数学问题小结
    STL_源码剖析之三:迭代器与traits
    算法导论第十二章:二叉查找树
    Common Lisp专家Peter Seibel对Google公司首席Java架构师Joshua Bloch的访谈(摘一段)
    STL源码剖析之六:算法
    STL 源码剖析之四:序列式容器
    算法导论第十四章:数据结构的扩张
    链表的归并排序:来自STL_ list_ sort 算法
    STL源码剖析之五:关联式容器
  • 原文地址:https://www.cnblogs.com/huibixiaoxing/p/8393888.html
Copyright © 2020-2023  润新知