1 // C++ program to implement Prim's Algorithm
2 #include <iostream>
3 #include <queue>
4 #include <vector>
5
6 using PII = std::pair<int, int>;
7
8 int prim(int x, const std::vector<std::vector<PII> >& graph) {
9 // priority queue to maintain edges with respect to weights
10 std::priority_queue<PII, std::vector<PII>, std::greater<PII> > Q;
11
12 //标记每个节点是否被访问
13 std::vector<bool> marked(graph.size(), false);
14 int minimum_cost = 0;
15
16 Q.push(std::make_pair(0, x));
17 while (!Q.empty()) {
18 // Select the edge with minimum weight
19 PII p = Q.top();
20 Q.pop();
21 x = p.second;
22 // Checking for cycle
23 if (marked[x] == true) {
24 continue;
25 }
26 minimum_cost += p.first;
27 marked[x] = true;
28 for (const PII& neighbor : graph[x]) {
29 int y = neighbor.second;
30 if (marked[y] == false) {
31 Q.push(neighbor);
32 }
33 }
34 }
35 return minimum_cost;
36 }
37
38 int main() {
39 int nodes = 0, edges = 0;
40 std::cin >> nodes >> edges; // number of nodes & edges in graph
41 if (nodes == 0 || edges == 0) {
42 return 0;
43 }
44
45 std::vector<std::vector<PII> > graph(nodes);
46
47 // Edges with their nodes & weight
48 for (int i = 0; i < edges; ++i) {
49 int x = 0, y = 0, weight = 0;
50 std::cin >> x >> y >> weight;
51 graph[x].push_back(std::make_pair(weight, y));
52 graph[y].push_back(std::make_pair(weight, x));
53 }
54
55 // Selecting 1 as the starting node
56 int minimum_cost = prim(1, graph);
57 std::cout << minimum_cost << std::endl;
58 return 0;
59 }