Official

E - Nearest Black Vertex Editorial by leaf1415


任意の \(2\) 頂点間の距離を前計算しておき、必要に応じて参照できるようにしておきます。 この前計算は、各頂点 \(s\) を始点として幅優先探索( BFS )を行うことで、各始点あたり \(O(N+M)\) 時間、全始点で行うと全体で \(O(N(N+M))\) 時間で行うことができます。

「頂点 \(v\) から最も近い黒い頂点までの距離がちょうど \(d\) である」という条件は 「頂点 \(v\) から距離が \(d\) 以下の黒い頂点が存在する」かつ「頂点 \(v\) から距離が \(d\) 未満の黒い頂点が存在しない」と言い換えられます。 よって、問題文中の \(2\) つの条件は、下記の \(3\) つの条件に言い換えられます。

  1. \(1\) つ以上の黒い頂点が 存在する。
  2. すべての \(i = 1, 2, \ldots, K\) について「頂点 \(p_i\) から距離が \(d_i\) 以下の黒い頂点が存在する」
  3. すべての \(i = 1, 2, \ldots, K\) について「頂点 \(p_i\) から距離が \(d_i\) 未満の黒い頂点が存在しない」

上記の条件 3. を満たすには、 「いずれかの \(i = 1, 2, \ldots, K\) で頂点 \(p_i\) から距離が \(d_i\) 未満にある」ような頂点は白で塗ることが必要かつ十分です。

あとは、まだ白で塗っていない残りの頂点をどのように塗れば、残る条件 1. と 2. が満たされるかを考えれば良いです。 しかし、条件 1. と 2. はどちらも「〜な黒い頂点が存在する」という形の条件であるので、結局、残りの頂点すべてを黒に塗るのが最適です。

結論として、「いずれかの \(i = 1, 2, \ldots, K\) で頂点 \(p_i\) から距離が \(d_i\) 未満にある」頂点は白で塗り、それら以外の頂点を黒で塗るのが最適であり、その「最適」な塗り方が実際に問題文中の条件を満たすかを確かめ、条件を満たすならば Yes とその塗り方を、条件を満たさなければ No を出力すれば本問題に正解できます。

posted:
last update: