Codeforces Round #490 (Div. 3)E. Reachability from the Capital

問題概要

頂点数 n の有効グラフが与えられる. 頂点 s からすべての頂点に到達可能にするには最小であと何本有向辺を追加すればよいか?

問題へのリンク

制約

  •  1 \le n \le 5000, 1 \le m \le 5000
  • 1 \le s \le s

解法

強連結成分分解をしたうえでトポロジカルソートをすれば, どの頂点に優先して辺を張ればいいかがわかります(よりトポロジカルソートしたときに早い頂点に辺を張りたいはずです). 

ただし, s から到達さえできればいいので, 次のようにすればいいです.

  • 到達可能かどうかを表す bool 配列 d[n] を用意する. はじめ  false で初期化する.
  • s から到達可能な頂点 v について, bfs などで d[v] = true としておく.   
  • 頂点集合をトポロジカルソートし, 頂点番号の早い順にみていく. もし d[v] = true なら辺を張る必要がないのでスルーし, d[v] = false なら辺を張ることにして答えに 1 を加算し, また v から到達可能な頂点 e をすべて d[e] = true に変更する.
  • 答えを出力する.

このアルゴリズムではたかだか定数回しか各頂点を見ないので, 時間計算量  O(n+m) で答えを得ることができます.

実装

ACL の scc を用いると非常に実装が簡便です. 

Submission #147250113 - Codeforces