-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgreedy-prims-minimum-spanning-tree.cpp
68 lines (53 loc) · 1.32 KB
/
greedy-prims-minimum-spanning-tree.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <bits/stdc++.h>
using namespace std;
int spanningTree(int V, int E, vector<vector<int>> graph);
int main(){
int t; cin>>t;
while(t--){
int V,E;
cin>>V>>E;
vector<vector<int>> graph(V, vector<int>(V, 0));
while(E--){
int u,v,w;
cin>>u>>v>>w;
u--,v--;
graph[u][v]=w;
graph[v][u]=w;
}
cout<<spanningTree(V, E, graph)<<endl;
}
return 0;
}
int findmin(int key[], bool mstset[], int size){
int globalminimum=INT_MAX;
int vertex=-1;
for(int i=0; i<size; i++){
if(mstset[i]==false && key[i]<globalminimum){
globalminimum=key[i];
vertex=i;
}
}
return vertex;
}
int spanningTree(int V,int E,vector<vector<int> > graph)
{
bool mstset[V];
int key[V], int parent[V], msum=0;
for(int i=0; i<V; i++){
key[i]=INT_MAX; mstset[i]=false;
}
key[0]=0;
parent[0]=-1;
for(int i=0; i<V; i++){
int vertex = findmin(key, mstset, V);
mstset[vertex]=true;
for(int j=0; j<V; j++){
if(graph[vertex][j] && mstset[j]==false && graph[vertex][j]<key[j]){
parent[j]=vertex;
key[j]=graph[vertex][j];
}
}
}
for(int x: key) msum+=x;
return msum;
}