-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGraphPrim.cpp
94 lines (87 loc) · 3.13 KB
/
GraphPrim.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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include <iostream>
#include <utility>
#include <vector>
#include <queue>
using namespace std;
class GraphPrim {
public:
vector<bool> visited;
vector<vector<pair<int,int>>> adjList;
vector<vector<pair<int,int>>> mst;
GraphPrim() {
long long int numberOfVertexes, numberOfEdges;
cin >> numberOfVertexes >> numberOfEdges;
vector<bool> visited;
visited.resize(numberOfVertexes + 1);
vector<vector<pair<int, int>>> adjList;
adjList.resize(numberOfVertexes + 1);
vector<vector<pair<int, int>>> mst;
mst.resize(numberOfVertexes + 1);
this->adjList = move(adjList);
this->visited = move(visited);
this->mst = move(mst);
for (int j = 1; j <= numberOfEdges; j++)
{
long long int v1, v2, w;
cin >> v1 >> v2 >> w;
this->adjList[v1].push_back(make_pair(v2,w));
this->adjList[v2].push_back(make_pair(v1,w));
}
}
long long int prim(int source, bool minimumSpanningTree) {
this->visited[source] = true;
priority_queue<pair<int,pair<int,int>>, vector<pair<int, pair<int,int>>>, greater<pair<int, pair<int,int>>>> priorityQueue;
pair<int, pair<int, int>> front;
pair<int, int> v;
long long int cost = 0;
for (int j = 0; j < (int)this->adjList[source].size(); ++j) {
v = this->adjList[source][j];
pair<int, pair<int, int>> p = minimumSpanningTree ? make_pair(v.second, make_pair(v.first, source)) : make_pair(-v.second, make_pair(-v.first, source));
priorityQueue.push(p);
}
while (!priorityQueue.empty()) {
front = priorityQueue.top();
int u = minimumSpanningTree ? front.second.first : -front.second.first;
int w = minimumSpanningTree ? front.first : -front.first;
int previous = priorityQueue.top().second.second;
priorityQueue.pop();
if (!this->visited[u]) {
cost += (long long int)w;
visited[u] = true;
mst[u].push_back(make_pair(previous, w));
mst[previous].push_back(make_pair(u, w));
for (int j = 0; j < (int)this->adjList[u].size(); ++j) {
v = adjList[u][j];
if (!visited[v.first]) {
pair<int, pair<int, int>> p = minimumSpanningTree ? make_pair(v.second, make_pair(v.first, u)) : make_pair(-v.second, make_pair(-v.first, u));
priorityQueue.push(p);
}
}
}
}
printMST();
return cost;
}
void printMST() {
int i = 0;
for (const auto& x : this->mst) {
cout << "Lista do " << i++ << endl;
for (auto y : x) {
cout << "(" << y.first << ", " << y.second << ") ";
}
cout << endl;
}
}
void freeGraph() {
this->visited.clear();
this->adjList.clear();
this->mst.clear();
}
};
int main()
{
GraphPrim prim;
cout << prim.prim(1, true) << endl;
prim.freeGraph();
return 0;
}