Vấn đề này có vẻ rất giống với việc tìm các nút khớp trong biểu đồ. Định nghĩa kỹ thuật của một điểm khớp nối, hoặc một thành phần hai thành phần là một nút có loại bỏ sẽ làm cho một đồ thị được chia thành hai.
Việc phát hiện ra các nút khớp nối từ một đồ thị là một vấn đề chủ yếu là giải quyết và bạn có thể tìm thêm thông tin chi tiết về nó ở đây: http://en.wikipedia.org/wiki/Biconnected_component
Dường như với tôi rằng cách bạn muốn tiếp cận một vấn đề như thế này nói chung sẽ một cái gì đó dọc theo những dòng:
1. Find all articulation points
2. Do a bfs from each node and determine articulation points along the path
3. Split graph at the articulation point, choosing the side with minimal edges
4. Continue until the two nodes are not connected
Trong ví dụ trên, 7 là điểm khớp chỉ và do đó bạn sẽ snip các cạnh giữa 7, 2 và 3 kể từ khi chỉ có hai mép giữa 7 và 0-4 biểu đồ và 3 cạnh giữa 7 và đồ thị 5,6,8.
Có một thuật toán được thiết lập để thực hiện việc này (đọc: một thuật toán mà tôi không đưa ra) được gọi là thuật toán của Karger có thể giải quyết được vấn đề của bạn, mặc dù trong thời gian n^2.
Thuật toán đó hoạt động bằng cách nối các nút lân cận với nhau một cách hiệu quả cho đến khi chỉ có hai nút và sau đó đếm số cạnh trái giữa hai nút. Số lượng cạnh là số lượng cắt giảm tối thiểu cần thiết để chia biểu đồ.
Cách bạn thực hiện thuật toán của Karger trong vấn đề của bạn sẽ chỉ cần báo trước rằng bạn nên luôn luôn tham gia các nút với hai nút bạn muốn tách. Ngoài ra, để có thể quay trở lại các cạnh ban đầu bạn cần cắt, bạn nên giữ một tham chiếu đến các nút mà các cạnh ban đầu thuộc về.
Có một hình dung vĩ đại của thuật toán karger đây: http://en.wikipedia.org/wiki/Karger%27s_algorithm
Nguồn
2013-06-04 19:29:46
Đây được gọi là sự cố "cắt tối thiểu". Nó liên quan chặt chẽ hơn đến lưu lượng tối đa so với đường đi ngắn nhất. –