AOJ 0200 - Traveling Alone
「友達がいないのではない.一人旅が好きなだけだ.」という弱々しい声が聞こえてきそうです.
しかし,私は一人旅に憧れる.
b -> aの逆順が存在することに気づいた.
蟻本にO(|E| log |V|)の解き方があったが,ごちゃごちゃしてしまったので後で理解する.
#include <iostream> #include <algorithm> const int INF = 1000000; int map[101][101][2];//a, b, cost, time; int d[101];//始点からの最短距離 bool used[101];//使われたかのフラグ int V;//頂点数 int dijkstra(int start, int end, bool flag){ std::fill(d, d + V + 1, INF); std::fill(used, used + V + 1, false); d[start] = 0; while(1){ int v = -1; for(int u=1;u<=V;u++){ if(!used[u] && (v == -1 || d[u] < d[v]))v = u; } if(v == -1)break; used[v] = true; for(int u=1;u<=V;u++){ d[u] = std::min(d[u], d[v] + map[v][u][flag]); } } return d[end]; } int main(){ int n, m;//track, station while(std::cin >> n >> m, n){ V = m; for(int i=0;i<101;i++){ for(int j=0;j<101;j++){ map[i][j][0] = (map[i][j][1] = INF); } } for(int i=n;i;i--){ int a, b, cost, time; std::cin >> a >> b >> cost >> time; map[a][b][0] = cost; map[a][b][1] = time; map[b][a][0] = cost; map[b][a][1] = time; } int k;//取り合わせ数 std::cin >> k; while(k--){ int p, q, r; std::cin >> p >> q >> r;//start, end, bool std::cout << dijkstra(p, q, r) << '\n'; } } }