結果

問題 No.241 出席番号(1)
ユーザー te-sh
提出日時 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
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

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;
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0