1. Recursive Edge Subset Spanning Tree Search
Intuition
Enumerate all combinations of V - 1 edges using recursion. Check each combination for connectivity and no cycles, recording the minimum weight sum.
Algorithm
- Recursively choose whether to include each edge.
- When exactly V - 1 edges are selected:
- Verify whether the selected edges connect all V vertices using BFS/DFS.
- If connected, compute sum of weights and update global minimum.
- Return the minimum weight found.
#include <iostream>#include <vector>#include <numeric>#include <algorithm> using namespace std; const int INF = 1e9; void dfs(int u, const vector<vector<int>>& adj, vector<bool>& visited) { visited[u] = true; for (int v : adj[u]) { if (!visited[v]) dfs(v, adj, visited); }} bool isConnectedTree(int V, const vector<vector<int>>& edges, const vector<int>& chosen) { vector<vector<int>> adj(V); for (int idx : chosen) { adj[edges[idx][0]].push_back(edges[idx][1]); adj[edges[idx][1]].push_back(edges[idx][0]); } vector<bool> visited(V, false); dfs(0, adj, visited); for (bool v : visited) { if (!v) return false; } return true;} void findMinST(int idx, int V, const vector<vector<int>>& edges, vector<int>& chosen, int currWeight, int& minWeight) { if (chosen.size() == V - 1) { if (isConnectedTree(V, edges, chosen)) { minWeight = min(minWeight, currWeight); } return; } if (idx == edges.size()) return; // Pick edge idx chosen.push_back(idx); findMinST(idx + 1, V, edges, chosen, currWeight + edges[idx][2], minWeight); chosen.pop_back(); // Skip edge idx findMinST(idx + 1, V, edges, chosen, currWeight, minWeight);} int main() { int V = 4; vector<vector<int>> edges = {{0, 1, 10}, {0, 2, 6}, {0, 3, 5}, {1, 3, 15}, {2, 3, 4}}; vector<int> chosen; int minWeight = INF; findMinST(0, V, edges, chosen, 0, minWeight); cout << "Min Spanning Tree Weight (Brute Force): " << minWeight << endl; return 0;}Time & Space Complexity
- Time complexity:
O(C(E, V - 1) * V) - Space complexity:
O(V + E)