提出 #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)

提出情報

提出日時
問題 D - 徒競走
ユーザ Linus
言語 PyPy3 (7.3.0)
得点 100
コード長 1868 Byte
結果 AC
実行時間 750 ms
メモリ 68924 KiB

ジャッジ結果

セット名 Sample Subtask1 All
得点 / 配点 0 / 0 30 / 30 70 / 70
結果
AC × 3
AC × 15
AC × 32
セット名 テストケース
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