강력하게 연결된 구성 요소


16

방향 그래프 에서 두 개의 서로 다른 꼭짓점 은 그래프에 서로간에 경로 가 있으면 강력하게 연결됩니다 . 그래프 의 강하게 연결된 구성 요소 는 그래프의 하위 집합이므로 하위 집합의 각 고유 정점 쌍이 강하게 연결되어 있으며 더 많은 정점을 하위 집합에 추가하면이 속성이 손상됩니다.

문제는 그래프를 강력하게 연결된 구성 요소로 분리하는 것입니다. 특히, 모든 SCC를 그래프로 출력해야합니다.

I / O :

입력으로 방향 모서리 목록, 인접 목록, 인접 행렬 또는 기타 적절한 입력 형식을 사용할 수 있습니다. 확실하지 않은지 물어보십시오. 그래프에 완전히 연결이 끊어진 정점이없고 자기 모서리가 없다고 가정 할 수 있지만 더 이상 가정 할 수는 없습니다. 선택적으로 정점 수와 정점 수를 입력으로 사용할 수도 있습니다.

출력으로, 각 서브리스트가 강하게 연결된 구성 요소 인 정점 목록 목록과 같은 정점의 분할 또는 각 레이블이 다른 구성 요소에 해당하는 정점 레이블을 지정해야합니다.

레이블을 사용하는 경우 레이블은 꼭짓점이거나 연속적인 정수 시퀀스 여야합니다. 이는 계산을 레이블로 넘치지 않도록하기위한 것입니다.

예 :

이 예제는 각 에지가 첫 번째 항목에서 두 번째 항목으로 향하는 가장자리 목록과 출력 파티션을 나타냅니다. 이 형식이나 다른 형식을 자유롭게 사용할 수 있습니다.

입력은 첫 번째 라인에 있고 출력은 두 번째 라인에 있습니다.

[[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:26의

마지막 테스트 케이스에, 나는 그 받고 있어요 8와 구성 요소에없는 [3,4]에만 각각 수 없기 때문에 67(어느 것도 그것에 도달).
xnor

답변:


7

numpy를 사용하는 Python 2, 71 62 바이트

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

numpy인접성과 노드 수를 나타내는 행렬 로 입력을 받습니다. 로 출력을 생성numpy구성 요소에서 가장 낮은 정점 수로 각 정점에 레이블 행 매트릭스 생성합니다.

인접 행렬 M의 경우 행렬 거듭 제곱 은 각 시작 정점에서 각 끝 정점까지 M**nn단계 경로 수를 계산합니다 . Mvia 를 통해 identity를 추가하면 M+M**0인접 행렬이 수정되어 모든 가장자리에 자체 루프가 추가됩니다. 따라서 (M+M**0)**n최대 길이의 경로를 계산합니다 n(중복 포함).

모든 경로는 최대 길이를 갖기 때문에 정점에 도달 할 수있는 n노드의 수 는 양의 항목에 해당합니다 . 도달 가능성 매트릭스는 이며 여기서 작업 은 입력 방식으로 작동합니다.(i,j)ji(M+M**0)**nR=(M+M**0)**n>0>0

전치가있는 위치 and와 같이 항목을 계산하면 상호 도달 가능한 정점의 쌍을 나타내는 행렬이 제공됩니다. 세 번째 행은 동일하게 연결된 컴포넌트의 정점에 대한 지표 벡터입니다. 각 행을 가져 가면 첫 번째 색인이 생성 되며 이는 구성 요소에서 가장 작은 정점의 색인입니다.R&R.TR.TiargmaxTrue


4

자바 스크립트 (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

MATL , 26 22 바이트

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

이것은 @ xnor 's 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에있는 두 정점은 서로 접근 할 수 있고 도달 가능성이 전이하기 때문에 동일한 정점 집합에 도달 할 수 있습니다. 다른 구성 요소의 정점에는 도달 가능한 집합이 다릅니다.

코드 설명 :

.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.