強く接続されたコンポーネント


16

有向グラフ内の2つの異なる頂点は、グラフ内に互いからのパスがある場合、強く接続されます。強連結成分グラフのサブセットに別個の頂点の各ペアが強固に接続され、サブセットにそれ以上の頂点を追加すると、このプロパティを破るであろうように、グラフのサブセットです。

あなたの課題は、グラフを強く接続されたコンポーネントに分離することです。具体的には、グラフ内のすべてのSCCを出力する必要があります。

I / O:

入力として、有向エッジのリスト、隣接リスト、隣接行列、またはその他の妥当な入力形式を使用できます。よくわからない場合は尋ねてください。グラフには完全に接続されていない頂点がなく、自己エッジがないと仮定できますが、それ以上の仮定はできません。オプションで、頂点の数だけでなく、頂点のリストを入力として使用することもできます。

出力として、各サブリストが強く接続されたコンポーネントである頂点のリストのリストなどの頂点のパーティション分割、または各ラベルが異なるコンポーネントに対応する頂点のラベル付けのいずれかを指定する必要があります。

ラベルを使用する場合、ラベルは頂点、または整数の連続したシーケンスである必要があります。これは、計算がラベルに流れ込むのを防ぐためです。

例:

これらの例は、各エッジが1番目のエントリから2番目のエントリに向けられているエッジのリストと、出力パーティションを取ります。この形式または別の形式を自由に使用できます。

入力は最初の行にあり、出力は2行目にあります。

[[1, 2], [2, 3], [3, 1], [1, 4]]
[[1, 2, 3], [4]]

[[1, 2], [2, 3], [3, 4]]
[[1], [2], [3], [4]]

[[1, 2], [2, 1], [1, 3], [2, 4], [4, 2], [4, 3]]
[[1, 2, 4], [3]]

[[1, 2], [2, 3], [2, 5], [2, 6], [3, 4], [3, 7], [4, 3], [4, 8], [5, 1], [5, 6], [6, 7], [7, 6], [8, 7], [8, 4]]
[[1, 2, 5], [3, 4, 8], [6, 7]]

スコアリングと制限:

いつものように、標準的な抜け穴は禁止されています。また、強力に接続されたコンポーネントを特に扱うビルトインは禁止されています。

ソリューションは、提供された例で1時間以内に実行する必要があります。(これは、遅い指数関数的な解法を防ぐことを目的としています。)

これはコードゴルフです。最少バイトが勝ちます。


接続されたコンポーネントに割り当てるラベルの柔軟性はどのくらいですか?たとえば、そのコンポーネントの頂点インデックスのリストは有効なラベルですか?
xnor

@xnor完全に柔軟。同等性テスト/同一の文字列で一致する必要があります。
isaacg

グラフの入力形式に頂点の数や頂点ラベルのリストを含めることはできますか?
-xnor

@xnor両方ともはい。編集します。
isaacg

最後のテストケースで8は、コンポーネントに含まれていないことを取得しています。[3,4]なぜなら、それぞれ67(どちらにも届かない)しかできないからです。
xnor

回答:


7

パイソン2、numpyの使用71の 62バイト

import numpy
def g(M,n):R=(M+M**0)**n>0;print(R&R.T).argmax(0)

入力をnumpy隣接関係とノード数を表す行列として受け取ります。numpyコンポーネント内の最小の頂点番号で各頂点にラベルを付ける行行列として出力を生成します。

隣接行列のM場合、行列の累乗M**nは、n各開始頂点から各終了頂点までのステップパスの数をカウントします。Mviaにアイデンティティを追加M+M**0すると、隣接行列が変更され、すべてのエッジに自己ループが追加されます。したがって、(M+M**0)**n最大で長さのパスをカウントしますn(冗長性あり)。

パスはせいぜい長さがあるのでn、ノードの数(i,j)、頂点jに到達できる場所iは、の正のエントリに対応し(M+M**0)**nます。その場合R=(M+M**0)**n>0、到達可能性マトリックスはであり、>0エントリ単位で機能します。

入門的にandを計算しますR&R.T。ここR.Tでは転置で、相互に到達可能な頂点のペアを示す行列を返します。このi行は、それと同じ強く接続されたコンポーネント内の頂点のインジケーターベクトルです。argmax各行を取得すると、最初の行のインデックスが得られTrueます。これは、そのコンポーネントの最小の頂点のインデックスです。


4

JavaScript(ES6)、125バイト

a=>a.map(([m,n])=>(e[m]|=1<<n|e[n],e.map((o,i)=>o&1<<m?e[i]|=e[m]:0)),e=[])&&e.map((m,i)=>e.findIndex((n,j)=>n&1<<i&&m&1<<j))

有向ペアのリストを引数として受け取り、結果は各頂点の配列であり、それに最初に接続された頂点を強く結び付けます。これは有効なラベル付けと見なされます。たとえば、入力[[1, 2], [2, 3], [2, 5], [2, 6], [3, 4], [3, 7], [4, 3], [4, 8], [5, 1], [5, 6], [6, 7], [7, 6], [8, 7], [8, 4]]で返されます[, 1, 1, 3, 3, 1, 6, 6, 3](頂点0はありません。頂点1、2、5にはラベル1があり、3、4、8にはラベル3があり、6と7にはラベル6があります)。


4

MATL26 22バイト

tnX^Xy+HMY^gt!*Xu!"@f!

これは@xnorのanswerと同じアプローチを使用します

で動作し、現在のバージョン(15.0.0)言語の。

入力はグラフの隣接行列で、行はセミコロンで区切られています。最初と最後のテストケースは

[0 1 0 1; 0 0 1 0; 1 0 0 0; 0 0 0 0]

[0 1 0 0 0 0 0 0; 0 0 1 0 1 1 0 0; 0 0 0 1 0 0 1 0; 0 0 1 0 0 0 0 1; 1 0 0 0 0 1 0 0; 0 0 0 0 0 0 1 0; 0 0 0 0 0 1 0 0; 0 0 0 1 0 0 1 0]

オンラインでお試しください!

t     % implicitly input adjacency matrix. Duplicate
n     % number of elements
X^    % square root
Xy    % identity matrix of that size
+     % add to adjacency matrix
HM    % push size again
Y^    % matrix power
g     % convert to logical values (0 and 1)
t!*   % multiply element-wise by transpose matrix
Xu    % unique rows. Each row is a connected component
!     % transpose
"     % for each column
  @   %   push that column
  f!  %   indices of nonzero elements, as a row
      % end for each. Implicitly display stack contents

3

Pyth、13バイト

.gu+Gs@LQG.{k

デモンストレーションテストスイート

入力は隣接リストであり、頂点をエッジを持つ頂点のリスト(有向隣接)にマッピングする辞書として表されます。出力はパーティションです。

プログラムの本質は、各頂点から到達可能な頂点のセットを見つけ、それらのセットで頂点をグループ化することです。同じSCC内の2つの頂点には、それぞれが到達可能な頂点のセットがあります。これは、それぞれが他の頂点から到達可能であり、到達可能性が推移的だからです。どちらのセットにも他のコンポーネントが含まれていないため、異なるコンポーネントの頂点には異なる到達可能セットがあります。

コードの説明:

.gu+Gs@LQG.{k
                  Implicit: Q is the input adjacency list.
.g           Q    Group the vertices of Q by (Q is implicit at EOF)
  u       .{k     The fixed point of the following function, 
                  starting at the set containing just that vertex
   +G             Add to the set
     s            The concatenation of
      @LQG        Map each prior vertex to its directed neighbors
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.