これは、二部グラフでのマッチング問題の例です。これは、巡回セールスマン問題よりもはるかに簡単に解決でき、O((n+k)^3) で解決できます。
次の 2 つの下位問題があります。
- 各レストランに到達できるユーザーを見つける
- 制約のオーバーフローを回避するために、人とレストランをマッチングする方法を見つける
レストランへのアクセス
たとえば、Floyd-Warshall アルゴリズムを使用して、O(n^3) 内のポイントの任意のペア間の最短経路を計算することができます。
許可されるマッチングは、1 km 未満の距離の接続です。
人とレストランのマッチング
このマッチング問題は、グラフを作成してから最大フローを解くことで解決できます。
適切なグラフは、ソース ノード、シンク ノード、および各人物と各レストランのノードを持つことです。
- ソースを容量 1 の各人に接続します
- キャパシティ1で1km以内の各レストランに各人を接続
- 各レストランを容量 Ceil(n/k) のシンク ノードに接続します。
次に、このグラフを通る最大フローを計算します。最大フローが n の場合にのみ、すべてのゲストを収容できます。
最大フローを計算するアルゴリズムは多数あります。1 つの例は、複雑さ O(V^3)の push-relabelです。ここで、V は頂点の数です (この問題では V=n+k+2)。