数値ごとに頂点を 1 つ、ペアごとにエッジを 1 つ持つグラフを作成します。
このグラフがチェーンまたはツリーの場合、「ペア」の数に 1 を加えた数の「数」があります。このグラフから任意の数のエッジを削除した後、頂点がエッジより少なくなることはありません。
このチェーン/ツリーに 1 つのサイクルを追加します。頂点と辺の数は同じです。このグラフから任意の数のエッジを削除した後でも、頂点がエッジより少なくなることはありません。
次に、切断されたコンポーネントをいくつでも追加します。それぞれに複数のサイクルが含まれないようにしてください。繰り返しになりますが、任意の数のエッジを削除した後、エッジより頂点が少なくなることはありません。
次に、切断されたコンポーネントのいずれかに 2 番目のサイクルを追加します。他のすべてのコンポーネントを取り外した後。ついに、頂点よりも多くのエッジができました (数よりも多くのペア)。
これらすべては、K+1 が、2 つのサイクルと、おそらくこれらのサイクルを接続するチェーンで構成される、可能な限り最小のサブグラフのエッジの数であるという結論につながります。
アルゴリズム:
接続されたコンポーネントごとに、Floyd-Warshall アルゴリズムを使用して、すべてのノードを通過する最短サイクルを見つけます。
次に、(単一コンポーネント内の) サイクルの重複しないペアごとに、ダイクストラのアルゴリズムを使用して、1 つのサイクルに少なくとも 3 つのエッジを持つ任意のノードから開始し、他のサイクルへの最短パスを見つけます。両方のサイクルの長さの合計と、それらを接続する最短パスを計算します。重複するサイクルのペアごとに、それらのエッジの数を計算するだけです。
これらすべてのサブグラフの最小の長さを見つけます。そして1を引きます。
上記のアルゴリズムは、グラフに少なくとも 1 つのダブル サイクル コンポーネントがある場合に K を計算します。そのようなコンポーネントがない場合、K = N です。