かしのブログ

競技プログラミングとか

第一回日本最強プログラマー学生選手権決勝 B - Reachability

問題

 3N頂点の有効グラフの頂点 x_0, \cdots, x_{N-1}, y_0, \cdots, y_{N-1}, z_0, \cdots, z_{N-1}

  •  x_iから y_jへ向かう辺が存在するか
  •  x_iから z_kへのパスが存在するか

がわかっている。この条件を満たす y_jから z_kへ向かう辺の集合があれば求める。

atcoder.jp

考察

これらの条件を満たさないのは、

  •  x_iから z_kへのパスがないが、 x_iから y_jへの辺があり、y_jから z_kへの辺があるような jがある
  •  x_iから z_kへのパスがあるが、 x_iから y_jへの辺があり、y_jから z_kへの辺があるような jがない

のいずれかである。また、前者は全ての y_jから z_kの辺が存在しない、後者は全ての y_jから全ての z_kへの辺を追加すれば解決する。 よって、一方を最低限満たすような辺の集合を作ったときに、他方が満たされるかを判定すればいい。

はじめ、全ての y_jから全ての z_kへの辺を用意する。これから、前者の条件を満たすように最低限の辺を削除する。 このとき、後者の条件が満たされているかを判定する。

実装

atcoder.jp