AOJ1604 Deadlock Detection
問題概要
次の処理を行う.
10個のスレッドのうち一つをランダムに選び命令を行う. 仮に命令が数字である場合, 他のスレッドにより数字に対応するロックが獲得されていなければそのロックを獲得する.
また, 命令がである場合, そのスレッドが獲得したロックを全て解放する.
長さの命令列に対し以上の処理を行う場合デッドロックが起こりうるか判定してください.
考えたこと
初めにを通過することでロックが全て解放されるので, ある同士の間の命令列はそれぞれ独立したものと考えることができる.
個の命令列があるとして, としておく. また番目の命令列の番目の命令をとする.
主にサンプル4から, デッドロックが起こりうるケースはとの有向グラフを考えたとき有向閉路が存在するときだとわかる.
ただし, を使うには からが有向閉路に含まれないことが条件となるため次のような動的計画法を行う.
を始点として, 最後に使ったロックがであり, すでに使った頂点集合がであるようなものが存在するかの二値テーブル.
これは, をtrueで初期化しておき, の辺を加える際に直前までの頂点集合とのを見て被りがなければ辺を加えることができるので更新する.
最終的にが始点と一致して, がtrueであれば有向閉路が存在することになる.
命令列に同じ数字が含まれるときも閉路が存在するのでそこだけ注意する.
全体の計算量はサンプル数, で通る.