1、uva 11374 Airport Express

  题意:给出若干经济舱的路线和商务舱的路线,但只能选择乘坐一次商务舱。求前往机场的最短时间。

  思路:分别从起点和终点求出到其他点的最短路,枚举每个商务舱,记录最小值。

  1 #include<iostream>
  2 #include<vector>
  3 #include<queue>
  4 #include<cstring>
  5 #include<algorithm>
  6 #include<cstdio>
  7 using namespace std;
  8 const int maxn = 510;
  9 const int INF = 0x3f3f3f3f;
 10 struct edge
 11 {
 12     int from, to, cost,next;
 13     edge(int ff=0,int tt=0,int cc=0,int nn=0):from(ff),to(tt),cost(cc),next(nn){ }
 14 };
 15 vector<edge>Edge;
 16 int Head[maxn], totedge;
 17 int N, S, E;
 18 int M, K;
 19 struct DIJ
 20 {
 21     bool vis[maxn];
 22     int preS[maxn];
 23     int disS[maxn];
 24     int disT[maxn];
 25     int preT[maxn];
 26     int st, ed,n;
 27     void set(int nodes,int source,int dest)
 28     {
 29         n=nodes,st = source, ed = dest;
 30     }
 31     void Init()
 32     {
 33         memset(Head, -1, sizeof(Head));
 34         totedge = 0;
 35         Edge.clear();
 36     }
 37     void addedge(int from, int to, int cost)
 38     {
 39         Edge.push_back(edge(from, to, cost, Head[from]));
 40         Head[from] = totedge++;
 41         Edge.push_back(edge(to, from, cost, Head[to]));
 42         Head[to] = totedge++;
 43     }
 44     void cal_dij(int *dis,int *pre)
 45     {
 46         memset(vis, 0, sizeof(vis));
 47         for (int i = 1; i <= n; i++) dis[i] = INF,pre[i]=-1;
 48         for (int i = Head[st]; i != -1; i = Edge[i].next)
 49         {
 50             dis[Edge[i].to] = Edge[i].cost;
 51             pre[Edge[i].to] = st;
 52         }
 53         vis[st] = true, dis[st] = 0;
 54         for (int i = 1; i < n; i++)
 55         {
 56             int u = st, Min = INF;
 57             for (int j = 1; j <= n; j++)
 58             {
 59                 if (!vis[j] && dis[j] < Min) u = j, Min = dis[j];
 60             }
 61             vis[u] = true;
 62             for (int k = Head[u]; k != -1; k = Edge[k].next)
 63             {
 64                 int v = Edge[k].to;
 65                 if (!vis[v] && dis[v] > dis[u] + Edge[k].cost)
 66                 {
 67                     dis[v] = dis[u] + Edge[k].cost;
 68                     pre[v] = u;
 69                 }
 70             }
 71         }
 72     }
 73     void PrintS(int u)
 74     {
 75         if (u != S) PrintS(preS[u]);
 76         if (u == S) printf("%d",u);
 77         else printf(" %d", u);
 78     }
 79     void PrintT(int u)
 80     {
 81         printf(" %d", u);
 82         if(u!=E) PrintT(preT[u]);
 83     }
 84 }dij;
 85 
 86 int main()
 87 {
 88     int Case = 1;
 89     while (~scanf("%d%d%d", &N, &S, &E))
 90     {
 91         if (Case > 1) printf("\n");
 92         scanf("%d", &M);
 93         dij.Init();
 94         for (int i = 1; i <= M; i++)
 95         {
 96             int u, v, c;
 97             scanf("%d%d%d", &u, &v, &c);
 98             dij.addedge(u, v, c);
 99         }
100         dij.set(N, S, E);
101         dij.cal_dij(dij.disS,dij.preS);
102         dij.set(N, E, S);
103         dij.cal_dij(dij.disT,dij.preT);
104         scanf("%d", &K);
105         int ans = dij.disS[E],from,to;
106         for(int i=1;i<=K;i++)
107         {
108             int u, v, c;
109             scanf("%d%d%d", &u, &v, &c);
110             if (dij.disS[u] + dij.disT[v] + c < ans) ans = dij.disS[u] + dij.disT[v] + c, from = u, to = v;
111             if (dij.disS[v] + dij.disT[u] + c < ans) ans = dij.disS[v] + dij.disT[u] + c, from = v, to = u;
112         }
113         if (ans == dij.disS[E])
114         {
115             dij.PrintS(E);
116             printf("\n");
117             printf("Ticket Not Used\n");
118             printf("%d\n", ans);
119         }
120         else
121         {
122             dij.PrintS(from);
123             dij.PrintT(to);
124             printf("\n");
125             printf("%d\n", from);
126             printf("%d\n", ans);
127         }
128         Case++;
129     }
130     return 0;
131 }
View Code

相关文章:

  • 2021-05-24
  • 2022-12-23
  • 2022-12-23
  • 2021-11-24
  • 2021-06-16
  • 2021-06-24
  • 2021-10-19
  • 2022-01-24
猜你喜欢
  • 2021-05-23
  • 2022-12-23
  • 2021-06-03
  • 2021-06-23
  • 2021-08-28
  • 2022-12-23
  • 2022-01-01
相关资源
相似解决方案