You can easily modify Floyd-Warshall algorithm. (If you're not familiar with graph theory at all, I suggest checking it out, e.g. getting a copy of Introduction to Algorithms).
Traditionally, you start path[i][i] = 0
for each i
. But you can instead start from path[i][i] = INFINITY
. It won't affect algorithm itself, as those zeroes weren't used in computation anyway (since path path[i][j]
will never change for k == i
or k == j
).
In the end, path[i][i]
is the length the shortest cycle going through i
. Consequently, you need to find min(path[i][i])
for all i
. And if you want cycle itself (not only its length), you can do it just like it's usually done with normal paths: by memorizing k
during execution of algorithm.
In addition, you can also use Dijkstra's algorithm to find a shortest cycle going through any given node. If you run this modified Dijkstra for each node, you'll get the same result as with Floyd-Warshall. And since each Dijkstra is O(n^2)
, you'll get the same O(n^3)
overall complexity.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…