結果
問題 | No.160 最短経路のうち辞書順最小 |
ユーザー | te-sh |
提出日時 | 2016-09-14 15:16:06 |
言語 | D (dmd 2.106.1) |
結果 |
AC
|
実行時間 | 28 ms / 5,000 ms |
コード長 | 2,089 bytes |
コンパイル時間 | 818 ms |
コンパイル使用メモリ | 134,420 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-06-12 04:22:31 |
合計ジャッジ時間 | 1,790 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1 ms
6,816 KB |
testcase_01 | AC | 1 ms
6,944 KB |
testcase_02 | AC | 1 ms
6,940 KB |
testcase_03 | AC | 2 ms
6,940 KB |
testcase_04 | AC | 7 ms
6,940 KB |
testcase_05 | AC | 12 ms
6,944 KB |
testcase_06 | AC | 17 ms
6,944 KB |
testcase_07 | AC | 3 ms
6,944 KB |
testcase_08 | AC | 4 ms
6,944 KB |
testcase_09 | AC | 3 ms
6,940 KB |
testcase_10 | AC | 5 ms
6,940 KB |
testcase_11 | AC | 5 ms
6,940 KB |
testcase_12 | AC | 4 ms
6,940 KB |
testcase_13 | AC | 4 ms
6,944 KB |
testcase_14 | AC | 4 ms
6,940 KB |
testcase_15 | AC | 3 ms
6,940 KB |
testcase_16 | AC | 4 ms
6,940 KB |
testcase_17 | AC | 4 ms
6,940 KB |
testcase_18 | AC | 4 ms
6,944 KB |
testcase_19 | AC | 4 ms
6,940 KB |
testcase_20 | AC | 4 ms
6,944 KB |
testcase_21 | AC | 4 ms
6,944 KB |
testcase_22 | AC | 3 ms
6,940 KB |
testcase_23 | AC | 4 ms
6,940 KB |
testcase_24 | AC | 4 ms
6,940 KB |
testcase_25 | AC | 3 ms
6,944 KB |
testcase_26 | AC | 4 ms
6,944 KB |
testcase_27 | AC | 2 ms
6,940 KB |
testcase_28 | AC | 28 ms
6,944 KB |
testcase_29 | AC | 2 ms
6,940 KB |
ソースコード
import std.algorithm, std.array, std.container, std.range, std.bitmanip; import std.numeric, std.math, std.bigint, std.random, core.bitop; import std.string, std.regex, std.conv, std.stdio, std.typecons; void main() { auto rd1 = readln.split.map!(to!size_t); auto n = rd1[0], m = rd1[1], s = rd1[2], t = rd1[3]; auto g = new Graph!int(n); foreach (_; 0..m) { auto rd2 = readln.split; auto a = rd2[0].to!size_t, b = rd2[1].to!size_t, c = rd2[2].to!int; g[a, b] = g[b, a] = c; } auto di = g.dijkstra(t); size_t[] calc(size_t[] r, int rest) { auto c = r.back; if (c == t) return r; foreach (i; 0..n) if (c != i && !g.isInf(c, i) && rest == g[c, i] + di[i]) return calc(r ~ i, rest - g[c, i]); assert(0); } writeln(calc([s], di[s]).map!(to!string).join(" ")); } import std.algorithm, std.container; class Mat(T) { size_t n; // size T[][] v; // values this(size_t n) { this.n = n; v = new T[][](n, n); } T opIndex(size_t i, size_t j) { return v[i][j]; } T opIndexAssign(T w, size_t i, size_t j) { v[i][j] = w; return w; } } class MatHasInf(T) : Mat!T { T inf; // infinite this(size_t n, T inf = -1) { super(n); this.inf = inf; } bool isInf(size_t i, size_t j) { return v[i][j] == inf; } } class Graph(T) : MatHasInf!T { this(size_t n, T inf = -1) { super(n, inf); foreach (i; 0..n) v[i][] = inf; foreach (i; 0..n) v[i][i] = 0; } T[] dijkstra(size_t s) { struct qitem { size_t v; T w; int opCmp(qitem rhs) { return w == rhs.w ? 0 : (w < rhs.w ? -1 : 1); } } auto qi = heapify!("a > b")(Array!qitem()); auto di = new T[](n); di[] = inf; void addNext(qitem q) { auto v = q.v, w = q.w; di[v] = w; foreach (i; 0..n) if (!isInf(v, i) && di[i] == inf) qi.insert(qitem(i, w + this[v, i])); } addNext(qitem(s, 0)); while (!qi.empty) { auto q = qi.front; qi.removeFront; if (di[q.v] != inf) continue; addNext(q); } return di; } }