1Option Explicit
2Dim objFSO, objTextStream
3Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")4Set objTextStream = objFSO.OpenTextFile(WScript.Arguments(0))56' 製品数と、可否が1の条件の数7Dim aryStrings, N, M
8aryStrings = Split(objTextStream.ReadLine())9N =CInt(aryStrings(0))10M =CInt(aryStrings(1))1112' 製品 ⇒ 後ろに並べられる製品群13Dim edge(), i, a, b
14ReDim edge(N -1)15For i =1To M
16 aryStrings = Split(objTextStream.ReadLine())17 a =CInt(aryStrings(0))18 b =CInt(aryStrings(1))19 edge(a)= edge(a)Or2^ b
20Next21objTextStream.Close()2223' 製品群 ⇒ その製品群を全て並べた際に先頭になりえる製品群24Dim start(), j
25ReDim start(2^ N -1)26For i =1To UBound(start)27' 製品が1つの場合は、その要素を並べればOK28If(i And i -1)=0Then29 start(i)= i
30Else31' 製品群内の製品それぞれについて32For j =0To N -133If i And2^ j Then34' その製品の後ろに並べられる製品が、残りの製品群の先頭になりえるなら、35' その製品は先頭になりえる36If edge(j)And start(i Xor2^ j)Then37 start(i)= start(i)Or2^ j
38EndIf39EndIf40Next41EndIf42Next4344' 各製品を先頭にした場合の組み合わせを1組ずつ出力45Dim x, y, ret
46For i =0To N -147 x =2^ N -148' その製品が先頭になりえるなら49If start(x)And2^ i Then50 j = i
51 ret =""52Do53 ret = ret & j &" "54 x = x Xor2^ j
55If x =0ThenExitDo56' 現在の製品の後ろに並べられて、残りの製品群の先頭になりえる製品を選ぶ57 y = edge(j)And start(x)58For j =0To N -159If y And2^ j ThenExitFor60Next61Loop62 WScript.Echo ret
63EndIf64Next