2010-10-26 33 views
6

Câu hỏi tương tự is posted here.Tìm tất cả các cơ sở chu trình trong biểu đồ, với tọa độ đỉnh được đặt

Tôi có biểu đồ không được chiếu với Vertex V và Cạnh E. Tôi đang tìm kiếm một thuật toán để xác định tất cả các cơ sở chu kỳ trong biểu đồ đó. Một ví dụ về một đồ thị như được hiển thị dưới đây:

alt text

Bây giờ, tất cả các tọa độ đỉnh là biết (không giống như câu hỏi trước, trái với lời giải thích trong sơ đồ trên) , do đó có thể tìm thấy các chu kỳ nhỏ nhất bao gồm toàn bộ biểu đồ.

Trong biểu đồ này, có thể có các cạnh không tạo thành bất kỳ chu kỳ nào.

Thuật toán tốt nhất để làm điều này là gì?

Dưới đây là một ví dụ khác mà bạn có thể có một cái nhìn tại địa chỉ:

Giả sử rằng e1 là cạnh đó được chọn đầu tiên, và mũi tên cho thấy sự chỉ đạo của The Edge.

+0

Đây có phải là câu hỏi C# không? Bạn có thể tìm thấy bất kỳ thuật toán chung nào giải quyết được vấn đề của bạn. –

+0

@mastoj, tôi đã chỉnh sửa thẻ. – Graviton

+0

thay đổi bí danh của tôi ... bạn có tìm thấy giải pháp không? Thuật toán đề xuất của tôi có phù hợp với bạn không? –

Trả lời

2

Tôi đã không cố gắng này và nó là khá tham lam nhưng nên làm việc:

  1. Chọn một nút
  2. Đến một của nó của các nước láng giềng
  3. Tiếp tục đi cho đến khi bạn lấy lại cho nút bắt đầu của bạn , nhưng bạn không được phép ghé thăm một nút cũ.
  4. Nếu bạn nhận được một chu kỳ lưu nó nếu nó không tồn tại hoặc một tập hợp con của các nút tạo nên một chu kỳ. Nếu nút trong chu trình là tập hợp con của các nút trong một chu kỳ khác, hãy loại bỏ chu kỳ lớn hơn (hoặc có thể tách nó thành hai?)
  5. Bắt đầu lại ở mức 2 với hàng xóm mới.
  6. Bắt đầu lại tại 1 bằng nút mới.

Nhận xét: Tại 3 bạn nên tất nhiên làm điều tương tự như đối với bước 2, vì vậy hãy thực hiện tất cả các đường dẫn có thể.

Có thể đó là sự khởi đầu? Như tôi đã nói, tôi chưa thử nó nên nó không được tối ưu.

CHỈNH SỬA: Phiên bản không được tài liệu và không được tối ưu hóa của một triển khai thuật toán có thể tìm thấy tại đây: https://gist.github.com/750015. Tuy nhiên, nó không giải quyết hoàn toàn giải pháp vì nó chỉ có thể nhận ra các tập con "đúng".

+0

@Thomas, không thực sự hoạt động. Tôi đã có giải pháp tùy chỉnh của riêng tôi. Cảm ơn. – Graviton

+0

@Thomas, giả sử một nút được kết nối với nhiều cạnh, sau đó làm thế nào để bạn chọn với cạnh để tiếp tục? – Graviton

+0

@Ngu: không quan trọng, bạn phải ghé thăm tất cả các cạnh.Lưu ý rằng tôi đã không thực hiện nó bản thân mình, nó đã túp lều một cái gì đó tôi đã đưa ra. Nhưng tôi nghĩ rằng nó có thể được thực hiện như somekind của thuật toán đệ quy. Cũng lưu ý rằng thuật toán không được tối ưu hóa, nó khá tham lam. –

Các vấn đề liên quan