結果
| 問題 |
No.1640 簡単な色塗り
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2021-11-29 14:21:53 |
| 言語 | Ruby (3.4.1) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,183 bytes |
| コンパイル時間 | 48 ms |
| コンパイル使用メモリ | 7,424 KB |
| 実行使用メモリ | 76,064 KB |
| 最終ジャッジ日時 | 2024-07-02 11:28:48 |
| 合計ジャッジ時間 | 6,251 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 1 TLE * 1 -- * 51 |
コンパイルメッセージ
Syntax OK
ソースコード
N = gets.to_i
$G = Array.new(N*2+2){Array.new}
def add_edge(from, to, cap)
$G[from] << [to, cap, $G[to].length]
$G[to] << [from, 0, $G[from].length - 1]
end
def bfs(s)
$level = Array.new(N*2+2, -1)
$level[s] = 0
que = [s]
while que.length > 0 do
v = que.shift
$G[v].each {|to, cap, rev|
if cap > 0 and $level[to] < 0 then
$level[to] = $level[v] + 1
que << to
end
}
end
end
def dfs(v, t, f)
return f if v == t
$G[v].each {|e|
if e[1] > 0 and $level[v] < $level[e[0]] then
d = dfs(e[0], t, [f, e[1]].min)
if d > 0 then
e[1] -= d
$G[e[0]][e[2]][1] += d
return d
end
end
}
return 0
end
def max_flow(s, t)
flow = 0
loop {
bfs(s)
return flow if $level[t] < 0
f = dfs(s, t, Float::INFINITY)
while f > 0 do
flow += f
f = dfs(s, t, Float::INFINITY)
end
}
end
s = 0
t = 2 * N + 1
1.upto(N) {|i|
add_edge(s, i, 1)
}
(N+1).upto(2*N) {|i|
add_edge(i, t, 1)
}
1.upto(N) { |i|
a, b = gets.split(" ").map{|s| s.to_i}
add_edge(i, a + N, 1)
add_edge(i, b + N, 1)
}
n = max_flow(s, t)
if n == N then
puts "Yes"
1.upto(N) {|i|
$G[i].each{|to, cap, rev|
puts (to - N) if cap == 0
}
}
else
puts "No"
end