Các thành phần kết nối mạnh mẽ


16

Hai đỉnh riêng biệt trong biểu đồhướng được kết nối mạnh nếu có đường dẫn trong biểu đồ từ điểm này sang điểm khác. Một thành phần được kết nối mạnh của biểu đồ là một tập hợp con của biểu đồ sao cho mỗi cặp đỉnh riêng biệt trong tập hợp con được kết nối mạnh và việc thêm bất kỳ đỉnh nào vào tập hợp con sẽ phá vỡ thuộc tính này.

Thách thức của bạn là tách một biểu đồ thành các thành phần được kết nối mạnh mẽ của nó. Cụ thể, bạn phải xuất tất cả các SCC trong biểu đồ.

Tôi / O:

Là đầu vào, bạn có thể sử dụng danh sách các cạnh được định hướng, danh sách kề, ma trận kề hoặc bất kỳ định dạng đầu vào hợp lý nào khác. Hỏi xem bạn có chắc không. Bạn có thể giả sử đồ thị không có các đỉnh hoàn toàn bị ngắt kết nối và không có các cạnh tự, nhưng bạn không thể đưa ra bất kỳ giả định nào nữa. Bạn cũng có thể tùy ý lấy danh sách các đỉnh làm đầu vào, cũng như số lượng đỉnh.

Là đầu ra, bạn phải phân vùng các đỉnh, chẳng hạn như danh sách các danh sách các đỉnh, trong đó mỗi danh sách con là một thành phần được kết nối mạnh hoặc ghi nhãn các đỉnh, trong đó mỗi nhãn tương ứng với một thành phần khác nhau.

Nếu bạn sử dụng nhãn, nhãn phải là đỉnh hoặc chuỗi số nguyên liên tiếp. Điều này là để ngăn chặn việc tính toán vào nhãn.

Ví dụ:

Các ví dụ này lấy danh sách các cạnh, trong đó mỗi cạnh được hướng từ mục nhập thứ nhất đến mục nhập thứ hai và phân vùng đầu ra. Bạn có thể tự do sử dụng định dạng này hoặc định dạng khác.

Đầu vào là trên dòng đầu tiên, đầu ra là trên dòng thứ hai.

[[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]]

Ghi điểm và hạn chế:

Lỗ hổng tiêu chuẩn bị cấm, như mọi khi. Ngoài ra, các phần mềm tích hợp xử lý cụ thể các thành phần được kết nối mạnh đều bị cấm.

Các giải pháp sẽ chạy trong không quá một giờ trên các ví dụ được cung cấp. (Điều này nhằm ngăn chặn các giải pháp theo cấp số nhân chậm, và không có gì khác.)

Đây là mã golf. Ít byte nhất sẽ thắng.


Làm thế nào linh hoạt là các nhãn chúng ta gán cho một thành phần được kết nối? Ví dụ, danh sách các chỉ số đỉnh trong thành phần đó có phải là nhãn hợp lệ không?
xnor

@xnor Hoàn toàn linh hoạt. Nên khớp qua kiểm tra đẳng thức / chuỗi giống hệt nhau.
isaacg

Có thể định dạng đầu vào biểu đồ của chúng tôi cũng chứa số lượng đỉnh và / hoặc danh sách các nhãn đỉnh?
xnor

@xnor Có cho cả hai. Tôi sẽ chỉnh sửa nó trong.
isaacg

Trong trường hợp thử nghiệm cuối cùng, tôi nhận được rằng 8nó không nằm trong một thành phần [3,4]vì nó không thể chỉ có mỗi 67(không ai trong số đó tiếp cận được nó).
xnor

Câu trả lời:


7

Python 2 sử dụng numpy, 71 62 byte

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

Lấy đầu vào dưới dạng numpyma trận đại diện cho kề và số lượng nút. Tạo đầu ra dưới dạng numpyma trận hàng gắn nhãn cho mỗi đỉnh bằng số đỉnh thấp nhất trong thành phần của nó.

Đối với ma trận kề M, công suất ma trận M**nđếm số lượng nđường dẫn bước từ mỗi đỉnh bắt đầu đến mỗi đỉnh kết thúc. Thêm danh tính Mthông qua M+M**0sửa đổi ma trận kề để thêm một vòng lặp tự cho mỗi cạnh. Vì vậy, hãy (M+M**0)**nđếm các đường dẫn có độ dài nhiều nhất n(có dự phòng).

Vì bất kỳ đường dẫn nào cũng có độ dài tối đa n, số lượng nút, bất kỳ (i,j)vị trí nào jcó thể đạt được đỉnh itương ứng với một mục nhập tích cực (M+M**0)**n. Ma trận khả năng tiếp cận là sau đó R=(M+M**0)**n>0, nơi các >0công trình tiếp theo.

Tính toán theo chiều ngang andnhư R&R.T, nơi R.Tchuyển vị, sau đó đưa ra một ma trận chỉ ra các cặp đỉnh có thể tiếp cận được. Đó là ithứ hàng là một véc tơ chỉ cho đỉnh trong cùng một thành phần kết nối mạnh mẽ như nó. Lấy argmaxmỗi hàng của nó cho chỉ số của đầu tiên Truetrong đó, là chỉ số của đỉnh nhỏ nhất trong thành phần của nó.


4

JavaScript (ES6), 125 byte

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

Lấy một danh sách các cặp được định hướng làm đối số, trong khi kết quả là một mảng cho mỗi đỉnh tạo cho đỉnh đầu tiên được kết nối mạnh mẽ với nó, mà tôi tin rằng nó được coi là một nhãn hợp lệ. Ví dụ, với đầu vào, [[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]]nó trả về [, 1, 1, 3, 3, 1, 6, 6, 3](không có đỉnh 0; các đỉnh 1, 2 và 5 có nhãn 1; 3, 4 và 8 có nhãn 3 trong khi 6 và 7 có nhãn 6).


4

MATL , 26 22 byte

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

Điều này sử dụng cách tiếp cận tương tự như câu trả lời của @ xnor .

Hoạt động trong phiên bản hiện tại (15.0.0) của ngôn ngữ.

Đầu vào là ma trận kề của đồ thị, với các hàng được phân tách bằng dấu chấm phẩy. Các trường hợp thử nghiệm đầu tiên và cuối cùng là

[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]

Hãy thử trực tuyến!

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

Bình thường, 13 byte

.gu+Gs@LQG.{k

Trình diễn , bộ thử

Đầu vào là một danh sách kề, được biểu diễn dưới dạng từ điển ánh xạ các đỉnh tới danh sách các đỉnh mà nó có các cạnh (hàng xóm được định hướng của nó). Đầu ra là một phân vùng.

Bản chất của chương trình là chúng ta tìm thấy tập hợp các đỉnh có thể tiếp cận từ mỗi đỉnh, sau đó nhóm các đỉnh theo các tập hợp đó. Bất kỳ hai đỉnh trong cùng một SCC đều có cùng một tập hợp các đỉnh có thể tiếp cận được từ chúng, bởi vì mỗi đỉnh có thể tiếp cận được với nhau và khả năng tiếp cận là bắc cầu. Bất kỳ đỉnh nào trong các thành phần khác nhau đều có các tập hợp có thể tiếp cận khác nhau, vì tập hợp này không chứa tập hợp khác.

Mã giải thích:

.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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.