1. 程式人生 > >UVA 11374 Airport Express(最短路+列舉)

UVA 11374 Airport Express(最短路+列舉)

題目分析

我們可以從S出發演算法最短路,然後從E出發算出最短路,然後列舉每一條特殊通道即可。輸出可能有些麻煩。

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1e4+100;
const int INF = 0x3f3f3f3f;

int N, S, E, M;
int d1[maxn], d2[maxn], vis[maxn];
int
head[maxn], tot; struct Edge{ int to, next, val; }e[maxn<<1]; void spfa(int S, int d[]){ for(int i = 0; i < maxn; i++) d[i] = INF; memset(vis, 0, sizeof(vis)); queue <int> q; q.push(S); vis[S] = 1; d[S] = 0; while(!q.empty()){ int u = q.front(); q.pop(); vis[u] = 0
; for(int i = head[u]; i != -1; i = e[i].next){ int v = e[i].to; if(d[v] > d[u] + e[i].val){ d[v] = d[u] + e[i].val; if(!vis[v]){ q.push(v); vis[v] = 1; } } } } } void
addedge(int from, int to, int val){ e[tot].to = to; e[tot].val = val; e[tot].next = head[from]; head[from] = tot++; } void init(){ tot = 0; memset(head, -1, sizeof(head)); } void print1(int u, int d[]){ for(int i = head[u]; i != -1; i = e[i].next){ int v = e[i].to; if(d[u] == d[v] + e[i].val){ print1(v, d); break; } } if(u == E) printf("%d\n", u); else printf("%d ", u); } void print2(int u, int d[]){ if(u == E) printf("%d\n", u); else printf("%d ", u); for(int i = head[u]; i != -1; i = e[i].next){ int v = e[i].to; if(d[u] == d[v] + e[i].val){ print2(v, d); break; } } } void solve(int f, int t){ if(f == -1){ print1(E, d1); printf("Ticket Not Used\n"); return ; } print1(f, d1); print2(t, d2); printf("%d\n", f); } int main(){ #ifdef LOCAL freopen("input.txt", "r", stdin); #endif // LOCAL int first = 0; while(scanf("%d%d%d", &N, &S, &E) != EOF){ if(first) printf("\n"); else first = 1; init(); int from, to, val; scanf("%d", &M); for(int i = 0; i < M; i++){ scanf("%d%d%d", &from, &to, &val); addedge(from, to, val); addedge(to, from, val); } spfa(S, d1); spfa(E, d2); scanf("%d", &M); int ans = d1[E]; int f = -1, t = -1; for(int i = 0; i < M; i++){ scanf("%d%d%d", &from, &to, &val); if(d1[from]+val+d2[to] < ans){ ans = d1[from]+val+d2[to]; f = from, t = to; } if(d1[to]+val+d2[from] < ans){ ans = d1[to]+val+d2[from]; f = to, t = from; } } solve(f, t); printf("%d\n", ans); } return 0; }