Giảm DAG tạm thời


13

Tôi đang tìm kiếm thuật toán O (V + E) để tìm mức giảm chuyển tiếp được đưa ra một DAG.

Đó là loại bỏ càng nhiều cạnh càng tốt để nếu bạn có thể tiếp cận v từ u, đối với v và u tùy ý, bạn vẫn có thể tiếp cận sau khi loại bỏ các cạnh.

Nếu đây là một vấn đề tiêu chuẩn, xin vui lòng chỉ cho tôi một số giải pháp mô hình.


Bạn không thể sử dụng tài liệu tham khảo được đưa ra trong bổ đề wikipedia mà bạn trích dẫn?
Hendrik ngày 1

2
Chà, thuật toán được thảo luận trong Wikipedia chạy trong (trong trường hợp tốt nhất, nghĩa là trong trường hợp đồ thị chu kỳ) thay vì như yêu cầu. Tôi nghĩ rằng câu trả lời đúng ở đây là thuật toán mà bạn hiện đang tìm kiếm có thể không tồn tạiO ( V + E )Ôi(V×E)Ôi(V+E)
Carlos Linares López

1
Đồng ý rằng không rõ ràng những gì bạn yêu cầu tồn tại. Có khá nhiều bài báo sẽ không thú vị nếu có một thuật toán như vậy, ví dụ: scazedirect.com/science/article/pii/0012365X9390164O . Điều đó nói rằng, nếu bạn có thể cụ thể hơn về động lực của bạn là gì, có thể có nhiều giải pháp cụ thể hơn. Ví dụ: bạn có biết gì khác về biểu đồ không hoặc hoạt động không? O(n(n+m))
William Macrae

Tôi đã thấy vấn đề ở đâu đó, nhưng không có thêm thông tin, có thể là lỗi chính tả trong vấn đề.
Karan

1
Điều gì sẽ xảy ra nếu bạn thực hiện sắp xếp tôpô trong DAG của mình, nhưng theo dõi các đỉnh có thể tiếp cận bằng cách sử dụng trẻ em, tức là , sau đó bắt đầu từ mục mới nhất trong biểu đồ được sắp xếp, và loại bỏ các cạnh không được sử dụng và đi lên bằng cách duy trì chức năng có thể tiếp cận, điều này mang lại cho bạn các cạnh tối đa có thể loại bỏ, nhưng tôi không chắc liệu nó có khả năng tối đa không (đó là .O ( | E | + | V | )remộtchmộtbtôie[v]= =v'chTôitôidrenvremộtchmộtbtôie[v']Ôi(|E|+|V|)

Câu trả lời:


8

Chúng ta có thể giải quyết vấn đề này chỉ bằng cách thực hiện DFS từ mỗi đỉnh.

  1. Đối với mỗi đỉnh , bắt đầu DFS từ mỗi đỉnh sao cho là hậu duệ trực tiếp của , tức là. là một cạnh.v v u ( u , v )uGvvbạn(bạn,v)
  2. Đối với mỗi đỉnh có thể truy cập bởi DFS từ , hãy loại bỏ cạnh . v ( u , v ' )v'v(bạn,v')

Độ phức tạp tổng thể của ở trên là độ phức tạp của việc chạy DFS ', đó là .O ( N ( N + M ) )NÔi(N(N+M))


1
Lưu ý rằng, không có triệu chứng, điều này có độ phức tạp tương tự như thuật toán trong bài viết Wikipedia được liên kết trong chính câu hỏi. Ôi(NM)
David Richerby

1
Đã đồng ý. Vì một câu trả lời ngắn gọn là do câu hỏi này, tôi đã trình bày một câu hỏi. Hơn nữa, một giải pháp là IMO, không thể. O(N)
pratyaksh

3

Không phải những gì bạn đang tìm kiếm. Nhưng chỉ dành riêng cho những kiến thức chia sẻ mục đích, bạn có thể làm điều đó với thông điệp nếu bạn cho rằng mỗi đỉnh để hoạt động như một bộ xử lý . Lưu ý mỗi đỉnh có một giá trị tương đương. Do đó, tồn tại một số đỉnh sao cho chúng lớn hơn tất cả các hàng xóm của chúng. Các đỉnh này làm như sau:Ôi(|E|)

  1. Đặt là hàng xóm nhỏ hơn tối đa của ,vbạnv
  2. gửi tin nhắn cho và bao gồm cạnh trong đầu ra.( v , bạn )bạn(v,bạn)
  3. Đối với mọi hàng xóm của và (và nhỏ hơn cả hai), không bao gồm trong đầu ra.u v ( v , w )wbạnv(v,w)
  4. Lặp lại các bước cho đến khi tất cả các cạnh cho một lân cận nhỏ hơn của đỉnh được bao gồm hoặc không được bao gồm trong đầu ra.v v(v,v')v'v

Bây giờ nếu một nút nhận được một tin nhắn từ mọi hàng xóm lớn hơn (tức là tất cả các cạnh được bao gồm hoặc không được bao gồm, thì nút hoạt động như thể nó là lớn nhất trong vùng lân cận của nó. Đó là, nó thực hiện đã đề cập trước đây 4 bước.v(v',v)v

Thuật toán này chấm dứt trong các thông điệp trong môi trường phân tán. Tôi biết đây không phải là những gì bạn đang yêu cầu.Ôi(|E|)


1

Bổ đề: Nếu có cạnh V -> Y và Y cũng là một người kế thừa gián tiếp của V, (ví dụ: V -> W -> + Y) thì cạnh V -> Y là bắc cầu và không phải là một phần của gốc chuyển tiếp.

Phương pháp: Theo dõi quá trình đóng bắc cầu của từng đỉnh, làm việc từ đầu đến đỉnh ban đầu theo thứ tự tôpô ngược. Tập hợp những người kế thừa gián tiếp của V là sự kết hợp của sự đóng cửa tạm thời của những người kế vị trực tiếp của V. Sự đóng cửa quá độ của V là sự kết hợp của những người kế thừa gián tiếp và những người kế thừa trực tiếp của nó.

Thuật toán:

    Initialise Visited as the empty set.
    For each vertex V of G, 
        Invoke Visit(V).

    Visit(V):
        If V is not in Visited,
            Add V to Visited, 
            Initialise Indirect as the empty set,
            For each edge V -> W in G,
                Invoke Visit(W),
                Add Closure(W) to Indirect.
            Set Closure(V) to Indirect.
            For each edge V -> W in G,
                Add W to Closure(V),
                If W is in the set Indirect,
                    Delete the edge V -> W from G.

Điều này giả định rằng bạn có một số cách hiệu quả để theo dõi các tập hợp đỉnh (ví dụ: bản đồ bit), nhưng tôi nghĩ giả định này cũng được thực hiện trong các thuật toán O (V + E) khác.

Một tác dụng phụ có khả năng hữu ích là nó tìm thấy sự đóng kín quá độ của từng đỉnh G.


Tôi đã xóa câu trả lời được đăng trên tài khoản trước đó của bạn. Nếu bạn vẫn muốn hợp nhất hai tài khoản của mình, vui lòng làm theo các bước trong trung tâm trợ giúp . Điều đó đang được nói, vì tài khoản trước đó không còn có bất kỳ nội dung hiển thị nào, bạn chỉ có thể dính vào tài khoản mới.
Gilles 'SO- ngừng trở nên xấu xa'

0

Tôi đã giải quyết vấn đề tương tự nhưng nó không hoàn toàn giống nhau. Nó yêu cầu tối thiểu không có cạnh nào trong biểu đồ sau khi giảm sao cho các đỉnh được kết nối ban đầu vẫn được kết nối và không có kết nối mới nào được thực hiện. Vì rõ ràng, nó không nói là tìm đồ thị rút gọn nhưng có bao nhiêu cạnh thừa. Vấn đề này có thể được giải quyết trong O (V + E). Liên kết đến lời giải thích là https://codeforces.com/blog/entry/56326 . Nhưng tôi nghĩ để tạo ra đồ thị thực sự, nó sẽ có độ phức tạp cao hơn O (N)

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.