Tuyến tồn tại giữa n cặp nút


8

Cho một đồ thị chu kỳ có hướng với nút, làm thế nào người ta có thể xác định xem có một đường dẫn giữa bất kỳ n cặp nút nào sau đây không ( 1 n + 1 ) , Câu , ( n n + n ) ? Có một thuật toán đơn giản trong O ( n ( n + m ) ) (trong đó m là số cạnh) bằng cách thực hiện một tìm kiếm từ mỗi nút 1 ... n , nhưng nó có thể được thực hiện tốt hơn?2n(1n+1),,(nn+n)O(n(n+m))1n

EDIT: Tôi đang tìm kiếm sự tồn tại, không phải là con đường hoàn chỉnh.


Nó không hoàn toàn rõ ràng những gì bạn đang yêu cầu. Bạn đang tìm kiếm một con đường duy nhất có chứa các cạnh bạn đề cập? Hay bạn đang tìm kiếm nhiều con đường?
Dave Clarke

2
@Dave: Anh ấy đang tìm kiếm OR của một phần nhỏ của ma trận đóng bắc cầu.
Radu GRIGore

1
@Alexandru, 1-> 4, 2-> 3. Bạn thêm 3-> 1, 4-> 2.
Radu GRIGore

6
Bạn có thể tính toán đóng cửa bắc cầu thông qua phép nhân ma trận nhanh sẽ tốt hơn thời gian O (nm) nếu m lớn.
Chandra Chekuri

4
@alexandru: đó không phải là những gì câu hỏi của bạn hỏi, để công bằng. Bạn đang yêu cầu một triển khai nhanh hơn, không thực tế (đó là một câu hỏi hợp lệ, nhưng riêng biệt)
Suresh Venkat

Câu trả lời:


5

Như Chandra Chekuri đã chỉ ra trong một bình luận, bạn chỉ có thể tính toán đóng cửa bắc cầu thông qua phép nhân ma trận nhanh, giải quyết vấn đề trong thời gian O ( ) (sử dụng phương pháp yêu thích của bạn, O ( n 2.376 ) thông qua Coppersmith và Winograd, hoặc thực tế hơn sử dụng Strassen's O ( n 2.81 )) và điều này sẽ tốt cho các biểu đồ dày đặc.nωn2.376n2.81

Bây giờ, tôi khẳng định rằng nếu bạn có thể đánh bại thời gian chạy này cho vấn đề của mình đối với các biểu đồ dày đặc, bạn sẽ có được thuật toán phát hiện tam giác hiệu quả hơn so với tính toán sản phẩm của hai ma trận Boolean. Sự tồn tại của một thuật toán như vậy là một vấn đề mở lớn.

Tôi sẽ giảm vấn đề tam giác thành vấn đề khả năng tiếp cận n-cặp-DAG. Giả sử chúng ta được đưa ra một biểu đồ G trên n nút và chúng ta muốn xác định xem G có chứa một tam giác hay không.

Bây giờ, từ G tạo DAG G 'như sau. Tạo bốn bản sao của tập đỉnh, , V 2 , V 3 , V 4 . Đối với các bản sao u iV i , v i + 1V i + 1 cho i = 1 , 2 , 3 , thêm một cạnh ( u i , v i + 1 ) khi và chỉ khi ( u , v )V1V2V3V4uiVivi+1Vi+1i=1,2,3(ui,vi+1)(u,v)đã ở G. Bây giờ nếu chúng ta hỏi liệu có một đường đi giữa bất kỳ cặp nào không cho tất cả các u G, thì điều này chính xác sẽ hỏi liệu có một tam giác trong G không . Biểu đồ hiện tại có 4 n nút và chúng tôi đang hỏi về n cặp. Tuy nhiên, chúng ta có thể thêm 2 n nút giả bị cô lập và thay vào đó có 3 n truy vấn (bằng cách thêm truy vấn cho 2 n cặp riêng biệt ( y , d ) trong đó y V 2(u1,u4)uG4nn2n3n2n(y,d) d một dummy), do đó việc có được một 6 n dụ -node chính xác vấn đề của bạn.yV2V3d6n


0

Sắp xếp theo cấu trúc liên kết ( ) sau đó truyền xuống một bit của các nút mà từ đó mỗi nút có thể đạt được ( O ( m n ) ).O(m+n)O(mn)

O(n)n+xxxn+x


m=o(n)

1
Làm thế nào là tốt hơn sau đó thuật toán cơ bản của tôi?
Alexandru

O((m+n)n/w)w

Đó là một sự đánh đổi: bạn sử dụng bộ nhớ phụ O (n * n / w) thay vì O (n).
Alexandru

@Alexandru, không có triệu chứng trong trường hợp xấu nhất là như vậy, nhưng phân tích trường hợp trung bình là khó khăn và tốt hơn có thể phụ thuộc vào số liệu thống kê về cấu trúc biểu đồ dự kiến.
Peter Taylor

0

O(N2)

yespath = array(1..N)       // output of the algorithm
                            // initially filled with false
processed = array(1..N)     // processed nodes

// HEURISTIC 1: some preprocessing
for every node u in 1..N
  if (no outbound edges from u) then processed[u] = true
  if (no inbound edges to u+N) then processed[u] = true

for each node u in [1..N]    // MAIN loop 
  if (not processed[u]) then
    collected = [u]          // a list that initially contains u
    visited = array(1..2*N)  // filled with zeroes        
    do a breadth first scan from u
       for each node v found in the search
         set visited[v] = distance from u
         if (v <= N) then add v to collected
    end do

    // HEURISTIC 2: useful collected info on other nodes <= N
    foreach node v in collected
      processed[v] = true
      if ( visited[ v + N ] > 0 and visited[v] < visited[v+N] ) then yespath[v] = true
    end foreach

  end if
end for // MAIN loop


O(N2)O(Nk)e>u+N

Các phương pháp phỏng đoán khác có thể được thêm vào, nhưng hiệu quả của chúng (và hiệu quả của ba đề xuất) phụ thuộc nhiều vào cấu trúc biểu đồ.

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.