Tôi đang cố gắng tìm một giải pháp hiệu quả cho vấn đề của mình. Giả sử rằng tôi có đồ thị có trọng số dương G
chứa 100 nút (mỗi nút được đánh số) và đó là đồ thị theo chu kỳ. Vì vậy, không thể có bất kỳ cạnh như 2,2 hoặc 2,1. Tôi đã có một danh sách các nút giả sử 10 từ biểu đồ G
. Giả sử mỗi nút này cũng nằm trong một mảng. Tôi đang tìm cách để tìm tổng trọng lượng của đường dẫn ngắn nhất từ nút 1 đến 100 đi qua ít nhất một số cụ thể (giả sử 5) trong số các nút đó từ danh sách đó.
Để đơn giản hóa nó, hãy xem xét biểu đồ có 6 nút, 0 ... 5, bây giờ nút 1 và 4 được đánh dấu là các điểm mà chúng ta có thể chỉ định để vượt qua. Giả sử các đường dẫn hiện có là 0-1-2-5, 0-3-4-5 và 1-4. Bây giờ, giả sử tất cả các cạnh có trọng số là 5 ngoại trừ 3 đến 4 có trọng số là 1. Nếu chúng ta chạy một thuật toán đường đi ngắn nhất thì về cơ bản nó sẽ tìm thấy đường dẫn 0-3-4-5 vì nó có trọng số 11. Tuy nhiên nếu chúng ta chạy một thuật toán chỉ định số lượng tối thiểu của các điểm được chỉ định và thử số lượng 2. Sau đó, thuật toán sẽ được chạy vào 0-1-4-5, trọng số là 15.
Tôi đã viết theo cách này
shortestPath(destinationNode, minAmount)
if(destinationNode == srcNode && minAmount < 1)
return 0
else if(destinationNode == srcNode && minAmount > 1)
return INFINITY
int destNo = destinationNode get number
int cost = INFINITY
for (int i = 0; i < destNo; i++)
if (d[i][destNo] != null)
int minimumAmountCount = minAmount;
for (int j = 0; j < marked.length(); j++)
if (marked[j] == i)
minimumAmountCount = minimumAmountCount - 1;
cost = MIN(cost, shortestPath(Node(i), minimumAmountCount);
return cost;
Về cơ bản, chúng tôi gọi thuật toán này bằng cách sử dụng nút đích và số lượng nút tối thiểu từ danh sách đó. Đầu tiên chúng tôi muốn đảm bảo rằng đây là một hàm đệ quy và nó phải có điểm dừng, sẽ là khi điểm đến được truyền bằng với nút nguồn (về cơ bản là nút # 0). Trường hợp thứ hai chúng ta cần kiểm tra là liệu chúng ta đã truy cập đủ số lượng chưa, vì vậy nếu nó nhỏ hơn 1 (0 hoặc số âm) thì chúng ta đã truy cập đủ điểm và trả về 0 vì khoảng cách từ nút # 0 đến nút # 0 sẽ là 0. Nếu chúng tôi đã không truy cập đủ số lượng sau đó chúng tôi trả lại vô hạn để thuật toán sẽ xem xét các đường dẫn khác.
Vì vậy, để phần trả về hoạt động, chúng ta phải xác định số của nút đích (nếu chúng ta nghĩ rằng chúng ta có 100 nút thì đó sẽ là nút số 99 khi bắt đầu ban đầu) và chi phí ban đầu là vô cùng.
Sau đó, chúng tôi chạy một vòng lặp for bắt đầu từ 0 (về cơ bản là nút số 0) cho đến số nút hiện tại của chúng tôi, điều này là do không có các cạnh ngược trên biểu đồ. Bằng cách sử dụng số nút, chúng tôi kiểm tra từ ma trận xem có trọng số hiện có cho các nút đó không. Nếu nó tồn tại thì chúng tôi khởi tạo một biến cho số tiền tối thiểu hiện tại của chúng tôi và sau đó chạy một vòng lặp và kiểm tra xem nguồn đến đích hiện tại có trong danh sách các nút được đánh dấu hay không. Nếu nó được đánh dấu thì chúng tôi chỉ cần giảm số tiền tối thiểu.
Đối với bước cuối cùng, chúng tôi chạy lại chức năng bằng cách thay đổi đích là nguồn hiện tại và với số tiền tối thiểu hiện tại.
Nhưng nó có vẻ rất tốn kém, vì thực tế là sự phức tạp tồi tệ nhất của vòng lặp lồng nhau chiếm O (| Node | ^ 2) và tổng số lần tái phát sẽ mất O (| Node | ^ 2 * | Edges |). Vì vậy, có bất kỳ giải pháp hiệu quả khác cho vấn đề này?