23

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!

jfs
  • 346,887
  • 152
  • 868
  • 1,518
russtbarnacle
  • 895
  • 1
  • 10
  • 14
  • 1
    What do you need this for? I imagine doing it efficiently won't be trivial, so is generating all the subsets of `n - 1` edges too slow? – IVlad May 29 '10 at 16:21
  • I'm implementing an algorithm from this paper (http://linkinghub.elsevier.com/retrieve/pii/S1571065309002066), one of the required steps is to iterate through all mst. – russtbarnacle May 29 '10 at 16:40
  • 1
    Hi! Not to revive an old thread, but I'm looking for an implementation (in any language) of an algorithm that will give me all spanning trees of a graph. This is very similar to what you were looking for. Did you have any success? – rjkaplan Dec 04 '11 at 00:14
  • I'm looking for the same thing. Did you? – Nether Apr 13 '17 at 12:34
  • One simple idea that comes to mind is a slight modification of Kruskal's algorithm that would at each selection step iterate over all candidate edges (i.e. all min-weight, yet unselected edges that do not create a cycle in the growing forest) instead of picking an arbitrary one. – Anthony Labarre May 24 '18 at 14:53
  • the method suggested above by @IVlad i.e. generating all subsets isn't correct. you will find some subsets that represent graphs with cycles and therefore aren't trees. – DSM Apr 28 '20 at 12:46
  • @DSM I don't see why that means it won't work - you can simply discard it if it's not a valid tree. It's a brute force method that lists all trees exhaustively, so while grossly inefficient, there's no reason it shouldn't work. – IVlad Apr 28 '20 at 13:03
  • I have found this http://www.mate.unlp.edu.ar/~liliana/lawclique_2016/07.pdf - which seems to describe some relatively simple algorithms, but not simple enough for me to be able to turn this into an answer after a quick read. – IVlad Apr 28 '20 at 13:11

3 Answers3

9

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
  • 3,057
  • 2
  • 24
  • 24
  • 1
    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 May 30 '10 at 00:10
  • 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 May 30 '10 at 09:35
  • 1
    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 May 30 '10 at 11:05
  • @russtbarnacle have you implemented any of these algorithms? – jguilhermeam Feb 02 '16 at 15:47
  • 1
    @Rubys How do you go about generating all Spanning Trees? And how would you compute their total weight? I couldn't find anything for this. – FaCoffee Oct 20 '16 at 13:05
  • So do we have implementations after a decade? – DSM Apr 28 '20 at 12:48
1

Ronald Rivest has a nice implementation in Python, mst.py

synthesizerpatel
  • 24,615
  • 4
  • 70
  • 85
  • 4
    This is an implementation that finds minimum spanning trees, as far as I can tell. Not _all_ spanning trees. – rjkaplan Dec 11 '11 at 04:38
0

You can find an idea in the work of Sorensen and Janssens (2005).

The idea is to generate the STs in the increasing order, and as soon as you get the bigger value of ST stop the enumeration.