Official

I - 避難計画/Evacuation Plan Editorial by QCFium


解法 1

明らかに標高の低い町から高い町へはいけないので、標高の低い町から順に「その町から直接行ける町に避難所へ辿りつける町があるか、その町自身が避難所ならその町自身も避難所へ辿りつける。そうでないなら辿りつけない」と避難所へ辿りつける町を判断していくのは正しいです。
頂点を標高でソートしなければならないので計算量は \(O(N \log(N) + M)\) です。

解法 2

水路の向きを逆にしたグラフにおいて、避難所のマス全てを始点とした多点始点の幅優先探索をするとよいです。
一点始点の (普通の) 幅優先探索では最初に始点を queue に push しますが、多点始点の場合は始点全てを queue に push してよいです。
これは、一つ仮想頂点 \(t\) を追加して\(t\) から全ての避難所へと辺を張ったとき、\(t\) からグラフ上の各頂点に辿りつけるか、というように一点始点に帰着すると分かりやすいです。
同じ頂点を \(2\) 度以上 push しないように気をつければ計算量は \(O(N + M)\) です。

posted:
last update: