views:

281

answers:

1

I've been looking for an implementation (I'm using networkx library.) that will find all the minimum spanning trees (MST) of an undirected weighted graph.

I can only find implementations for Kruskal's Algorithm and Prim's Algorithm both of which will only return a single MST.

I've seen papers that address this problem (such as Representing all minimum spanning trees with applications to counting and generation) but my head tends to explode someway through trying to think how to translate it to code.

In fact i've not been able to find an implementation in any language!

+1  A: 

I don't know if this is the solution, but it's a solution (it's the graph version of a brute force, I would say):

  1. Find the MST of the graph using kruskal's or prim's algorithm. This should be O(E log V).
  2. Generate all spanning trees. This can be done in O(Elog(V) + V + n) for n = number of spanning trees, as I understand from 2 minutes's worth of google, can possibly be improved.
  3. Filter the list generated in step #2 by the tree's weight being equal to the MST's weight. This should be O(n) for n as the number of trees generated in step #2.

Note: Do this lazily! Generating all possible trees and then filtering the results will take O(V^2) memory, and polynomial space requirements are evil - Generate a tree, examine it's weight, if it's an MST add it to a result list, if not - discard it.
Overall time complexity: O(Elog(V) + V + n) for G(V,E) with n spanning trees

Rubys
Interesting. The paper i refer to in the question has a similar requirement of generating all spanning trees. It refers to another paper "Algorithms for Enumerating All Spanning Trees of Undirected and Weighted Graphs" but i'm pretty much back again at being unable to find *any* implementations of that or generally enumerating all spanning trees. Seems i may have to implement this paper or both papers to get the solution.
russtbarnacle
Wait, you're hoping to find an implementation in your favorite language of this? I wouldn't count on it. You have the algorithms, implement them. Doubt it's gonna get any better than that.
Rubys
I was hoping to find an implementation but i have been unable to find one in any language for "all spanning trees" or "all minimum spanning trees". So i was more surprised that there are no implementations at all, in any language.
russtbarnacle