結果
| 問題 |
No.241 出席番号(1)
|
| ユーザー |
|
| 提出日時 | 2016-09-21 14:05:39 |
| 言語 | D (dmd 2.109.1) |
| 結果 |
AC
|
| 実行時間 | 4 ms / 2,000 ms |
| コード長 | 2,686 bytes |
| コンパイル時間 | 757 ms |
| コンパイル使用メモリ | 123,928 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-06-12 04:31:03 |
| 合計ジャッジ時間 | 2,341 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 29 |
ソースコード
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 n = readln.chomp.to!size_t;
auto ai = iota(n).map!(_ => readln.chomp.to!size_t).array;
auto g = new MatGraph(n * 2 + 2);
foreach (i; 0..n) {
g[n * 2, i] = 1;
g[i + n, n * 2 + 1] = 1;
foreach (j; 0..n)
if (j != ai[i]) g[i, j + n] = 1;
}
auto r = g.fordFulkerson(n * 2, n * 2 + 1);
auto s = new size_t[](n);
foreach (i; 0..n) {
auto t = r.v[i].countUntil!(a => a != 0 && !isInf(a));
if (t < 0) {
writeln(-1);
return;
}
s[i] = t - n;
}
s.each!(writeln);
}
template Graph(T) {
T inf = -1;
auto isInf(T val) { return val == inf; }
class Mat {
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 MatGraph : Mat {
this(size_t n) {
super(n);
foreach (i; 0..n) v[i][] = inf;
foreach (i; 0..n) v[i][i] = 0;
}
auto bfs(size_t s, size_t t) {
auto visited = new bool[](n);
visited[s] = true;
auto si = new DList!(size_t[]);
si.insertBack([s]);
while (!si.empty) {
auto vs = si.front;
si.removeFront;
foreach (i; 0..n)
if (!isInf(this[vs[$-1], i]) && !visited[i]) {
if (i == t) {
return vs ~ i;
} else {
visited[i] = true;
si.insertBack(vs ~ i);
}
}
}
return cast(size_t[])[];
}
auto fordFulkerson(size_t s, size_t t) {
auto c = new MatGraph(n);
auto r = new MatGraph(n);
foreach (i; 0..n) r.v[i][] = v[i][];
auto vs = r.bfs(s, t);
while (vs.length > 0) {
auto vn = vs.length - 1;
auto minW = T.max;
foreach (i; 0..vn) minW = min(minW, r[vs[i], vs[i+1]]);
foreach (i; 0..vn) {
auto u = vs[i], v = vs[i+1];
if (!isInf(this[u, v])) {
if (isInf(c[u, v])) c[u, v] = minW;
else c[u, v] = c[u, v] + minW;
} else {
c[v, u] = c[v, u] - minW;
if (c[v, u] == 0) c[v, u] = inf;
}
if (isInf(r[v, u])) r[v, u] = minW;
else r[v, u] = r[v, u] + minW;
r[u, v] = r[u, v] - minW;
if (r[u, v] == 0) r[u, v] = inf;
}
vs = r.bfs(s, t);
}
return c;
}
}
}
mixin Graph!int;