結果

問題 No.1640 簡単な色塗り
ユーザー 小野寺健小野寺健
提出日時 2021-11-29 14:21:53
言語 Ruby
(3.3.0)
結果
TLE  
実行時間 -
コード長 1,183 bytes
コンパイル時間 130 ms
コンパイル使用メモリ 11,352 KB
実行使用メモリ 72,176 KB
最終ジャッジ日時 2023-09-15 06:57:08
合計ジャッジ時間 4,715 ms
ジャッジサーバーID
(参考情報)
judge14 / judge13
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 85 ms
19,528 KB
testcase_01 AC 77 ms
15,036 KB
testcase_02 AC 81 ms
15,264 KB
testcase_03 AC 80 ms
15,036 KB
testcase_04 TLE -
testcase_05 -- -
testcase_06 -- -
testcase_07 -- -
testcase_08 -- -
testcase_09 -- -
testcase_10 -- -
testcase_11 -- -
testcase_12 -- -
testcase_13 -- -
testcase_14 -- -
testcase_15 -- -
testcase_16 -- -
testcase_17 -- -
testcase_18 -- -
testcase_19 -- -
testcase_20 -- -
testcase_21 -- -
testcase_22 -- -
testcase_23 -- -
testcase_24 -- -
testcase_25 -- -
testcase_26 -- -
testcase_27 -- -
testcase_28 -- -
testcase_29 -- -
testcase_30 -- -
testcase_31 -- -
testcase_32 -- -
testcase_33 -- -
testcase_34 -- -
testcase_35 -- -
testcase_36 -- -
testcase_37 -- -
testcase_38 -- -
testcase_39 -- -
testcase_40 -- -
testcase_41 -- -
testcase_42 -- -
testcase_43 -- -
testcase_44 -- -
testcase_45 -- -
testcase_46 -- -
testcase_47 -- -
testcase_48 -- -
testcase_49 -- -
testcase_50 -- -
testcase_51 -- -
testcase_52 -- -
testcase_53 -- -
07_evil_01.txt -- -
07_evil_02.txt -- -
権限があれば一括ダウンロードができます
コンパイルメッセージ
Syntax OK

ソースコード

diff #

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
0