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 }