|
| 1 | +# Reverse Delete Algorithm (Minimum Spanning Tree) |
| 2 | +Greedy Algorithm to find a minimum spanning tree in an undirected graph by deleting heaviest edges unless it would disconnect the graph |
| 3 | + |
| 4 | +## Problem Statement |
| 5 | +**Minim Spanning Tree:** a subset of nodes that touches all vertices while keeping all nodes connected and uses the sum of the edge weights in a minimum |
| 6 | +A Minimum spanning tree yields a graph with **M-1** edges because adding 1 more edge would by definition create a cycle |
| 7 | + |
| 8 | +### Graph |
| 9 | + |
| 10 | + |
| 11 | +### Minimum Spanning Tree |
| 12 | + |
| 13 | +#### Weight = 18+14+9+7+6+5+2 = 61 |
| 14 | + |
| 15 | +## Reverse Delete Greedy Strategy |
| 16 | +**Start with all edges in the tree T. Consider edges in descending order of weight. Delete edge from T unless doing so would disconnect T** |
| 17 | + |
| 18 | +- Sort edges by weight |
| 19 | +- Initialize MST with all edges |
| 20 | +- Delete the highest weight edge |
| 21 | + - If deleting the edge disconnects the graph, add it back |
| 22 | + - Otherwise continue |
| 23 | + |
| 24 | +## Usage |
| 25 | +- Node names are consecutive integers starting from `0` |
| 26 | +- Create a graph: `ArrayList<Edge> graph = new ArrayList<Edge>();` |
| 27 | +- Graph undirected edge list, but **only add each edge once** |
| 28 | + - In the graph there is an edge from `0` to `9` with weight=`9` |
| 29 | + - This bidirectional edge can just be represented once: `graph.add(new Edge(0, 1, 9));` |
| 30 | +- Count the vertices in the graph: `int vertexCount = 8;` |
| 31 | +- Call the static method `ReverseDeleteMST.findMST(graph, vertexCount);` |
| 32 | + |
| 33 | +# Code Notes |
| 34 | +- Due to the implementation of Breadth First Search, the code creates an additional copy of the graph as an adjacency list |
| 35 | +- This adjacency list graph is the one where edges are deleted, the original input graph as an edge list is left in tact |
| 36 | +- The MST is technically built up from nothing and added to if deleting an edge in the adjacency list would disconnect the graph |
| 37 | + |
| 38 | +## References |
| 39 | +- [Kevin Wayne Slides](https://www.cs.princeton.edu/~wayne/kleinberg-tardos/pdf/04GreedyAlgorithmsII.pdf#page=14) |
| 40 | +- [University of Illinois - Minimum Spanning Trees](https://courses.engr.illinois.edu/cs473/sp2011/Lectures/12_notes.pdf) |
| 41 | +- [T. M. Murali Slides](http://courses.cs.vt.edu/cs5114/spring2009/lectures/lecture05-greedy-graph-algorithms.pdf#page=36) |
| 42 | +- [Fan Chung Graham Slides](http://www.math.ucsd.edu/~fan/teach/202/14/04mst.pdf#page=11) |
| 43 | +- [Reverse Delete Algorithm - GeeksForGeeks](http://www.geeksforgeeks.org/reverse-delete-algorithm-minimum-spanning-tree/) Algorithm strategy, code only briefly referenced |
| 44 | +- [Remove items from ArrayList with certain value - Stack Overflow](https://stackoverflow.com/a/29107463/8132253) Lambda expression to delete specific value from `ArrayList` |
0 commit comments