Minimum Spanning Tree (Prim Algorithm) |
Prim's algorithm is a greedy algorithm used to find the minimum spanning tree of a connected, weighted graph. It starts from an arbitrary vertex and grows the minimum spanning tree by adding the shortest edge that connects the tree to a new vertex, ensuring that it never forms a cycle. The algorithm typically utilizes a priority queue to efficiently select the next edge to include in the minimum spanning tree.
Time Complexity: O(mlogn)
#include <iostream>
#include <vector>
#include <climits>
#include <cmath>
#include <unordered_map>
#include <unordered_set>
#include <queue>
using namespace std;
vector<vector<int>> minimumSpanningTree(vector<vector<int>>& graph){
priority_queue<pair<int,pair<int,int>>,vector<pair<int,pair<int,int>>>,greater<pair<int,pair<int,int>>>> pq;
unordered_set<int> set;
vector<vector<int>> answer;
int lastNode = 0;
int count = 1;
while(count<graph.size()){
for(int i = 0; i<graph[lastNode].size(); i++){
if(graph[lastNode][i]!=0){
pq.push(make_pair(graph[lastNode][i],make_pair(lastNode,i)));
}
}
bool done = false;
while(!done){
pair<int,pair<int,int>> n = pq.top();
if(set.find(n.second.first)!=set.end() && set.find(n.second.second)!=set.end()){
pq.pop();
continue;
}
answer.push_back({pq.top().second.first,pq.top().second.second});
set.insert(pq.top().second.first);
set.insert(pq.top().second.second);
done = true;
if(lastNode==pq.top().second.first){
lastNode = pq.top().second.second;
} else {
lastNode = pq.top().second.first;
}
pq.pop();
count++;
}
}
return answer;
}