提出 #17692803
ソースコード 拡げる
# 用語をここで整理しておこう
# 順序関係が整合しているので、有向グラフに書き直すとそのグラフはDAG()になります(蟻本p.89)
# トポロジカル順序、トポロジカルソートの問題(蟻本p.89-90)
# 解法はbitDP(蟻本p.173)
# 蟻本にある巡回セールスマン問題、今回の徒競走とも、bitDPでメモ化してN!の計算量を2^Nに落とす問題
# 疑問:例えば1と2に直接関係がないけど1-3-2の順序が決まっている場合、集合(1,2)で実際にありえない順序(2-1)をカウントしてしまわないか?
# 解答:問題ない。集合(1,2,3)の数を考えるときに、集合(1,2)のカウントは(3が先頭に来ないから)合計されないので、最終的な結果に影響しない。
# PyPy3だと通る(マジかよ)
# 計算量は外側のループから順に、2**n * n * m
# 2**16 * 16 * (16*15)/ 2 = 125829120
# あれ1億2500万だぞ……!? しかもこのコードは途中breakしないから全部回るぞ……何で通ったの???
n, m = list(map(int, input().split()))
condition = [list(map(lambda x: int(x)-1, input().split())) for _ in range(m)]
# 1-index→0-index
dp = [0] * (2**n)
dp[0] = 1 # 空集合をトポロジカルソートする場合の数
for idx in range(1, 2**n):
for digit in range(n):
if 2**digit & idx > 0: # digitに対応する頂点vが、今考えている頂点集合Sに含まれていて
may_be_first = True
for pair in condition:
# S-v がfitst, vがsecondとなる対があるか
if (2**pair[0] & idx > 0) and pair[1] == digit:
may_be_first = False
if may_be_first:
dp[idx] += dp[idx - 2**digit]
print(dp[-1])
# print(dp)
提出情報
ジャッジ結果
| セット名 | Sample | Subtask1 | All | ||||||
|---|---|---|---|---|---|---|---|---|---|
| 得点 / 配点 | 0 / 0 | 30 / 30 | 70 / 70 | ||||||
| 結果 |
|
|
|
| セット名 | テストケース |
|---|---|
| Sample | 0_00.txt, 0_01.txt, 0_02.txt |
| Subtask1 | 0_00.txt, 0_01.txt, 1_00.txt, 1_01.txt, 1_02.txt, 1_03.txt, 1_04.txt, 1_05.txt, 1_06.txt, 1_07.txt, 1_08.txt, 1_09.txt, 1_10.txt, 1_11.txt, 1_12.txt |
| All | 0_00.txt, 0_01.txt, 0_02.txt, 1_00.txt, 1_01.txt, 1_02.txt, 1_03.txt, 1_04.txt, 1_05.txt, 1_06.txt, 1_07.txt, 1_08.txt, 1_09.txt, 1_10.txt, 1_11.txt, 1_12.txt, 2_00.txt, 2_01.txt, 2_02.txt, 2_03.txt, 2_04.txt, 2_05.txt, 2_06.txt, 2_07.txt, 2_08.txt, 2_09.txt, 2_10.txt, 2_11.txt, 2_12.txt, 2_13.txt, 2_14.txt, 2_15.txt |
| ケース名 | 結果 | 実行時間 | メモリ |
|---|---|---|---|
| 0_00.txt | AC | 77 ms | 61752 KiB |
| 0_01.txt | AC | 50 ms | 61836 KiB |
| 0_02.txt | AC | 88 ms | 68264 KiB |
| 1_00.txt | AC | 52 ms | 61904 KiB |
| 1_01.txt | AC | 62 ms | 68028 KiB |
| 1_02.txt | AC | 63 ms | 67588 KiB |
| 1_03.txt | AC | 66 ms | 68048 KiB |
| 1_04.txt | AC | 65 ms | 68040 KiB |
| 1_05.txt | AC | 54 ms | 65572 KiB |
| 1_06.txt | AC | 62 ms | 67784 KiB |
| 1_07.txt | AC | 66 ms | 68032 KiB |
| 1_08.txt | AC | 63 ms | 67476 KiB |
| 1_09.txt | AC | 66 ms | 67872 KiB |
| 1_10.txt | AC | 64 ms | 67900 KiB |
| 1_11.txt | AC | 59 ms | 68024 KiB |
| 1_12.txt | AC | 65 ms | 67924 KiB |
| 2_00.txt | AC | 89 ms | 68204 KiB |
| 2_01.txt | AC | 750 ms | 68456 KiB |
| 2_02.txt | AC | 664 ms | 68396 KiB |
| 2_03.txt | AC | 413 ms | 68772 KiB |
| 2_04.txt | AC | 199 ms | 68492 KiB |
| 2_05.txt | AC | 282 ms | 68252 KiB |
| 2_06.txt | AC | 245 ms | 68440 KiB |
| 2_07.txt | AC | 346 ms | 68716 KiB |
| 2_08.txt | AC | 249 ms | 68388 KiB |
| 2_09.txt | AC | 555 ms | 68840 KiB |
| 2_10.txt | AC | 335 ms | 68388 KiB |
| 2_11.txt | AC | 741 ms | 68924 KiB |
| 2_12.txt | AC | 153 ms | 68264 KiB |
| 2_13.txt | AC | 237 ms | 68860 KiB |
| 2_14.txt | AC | 175 ms | 68500 KiB |
| 2_15.txt | AC | 155 ms | 68832 KiB |