kruskal_mst.h
Go to the documentation of this file.
1 
2 
3 
4 #ifndef _MST_H
5 #define _MST_H
6 
7 /*
8  Contract:
9  Input : Graph G
10  Output : A list of edges that make up a minimum spanning tree.
11 
12 */
13 
14 /* Type expectation of Graph
15 
16  iterators - vertex and edge
17 
18 
19 */
20 template<typename OutputIter>
21 OutputIter kruskal_mst(graph& G, OutputIter res) {
22 
23  /*
24  The
25  */
26 
27  disjoint_sets<graph::vertex_t> sets;
28 
29  // vertex iterator
30  for(graph::vertex_iter it = G.vbegin(); it != G.vend(); it++) {
31  sets.make_set(*it);
32  }
33 
34  std::list<Graph::edge_type> edges;
35 
36  // edge iterator
37  for(graph::edge_iter it = G.ebegin(); it != G.eend(); it++)
38  edges.push_back(*it);
39 
40  edges.sort();
41 
42  // expand and merge the components iteratively
43  for(graph::edge_type edge : edges) {
44 
45  graph::vertex_type u = edge.either(), v = edge.other();
46 
47  if(sets.find(u) != sets.find(v)) {
48  // Different component
49  sets.unite(u, v);
50  res++ = edge;
51  }
52  }
53 
54  return res;
55 }
56 
57 
58 
59 /**************************************************
60 
61 Working Version
62 
63 
64 template<typename vertex_t, typename edge_t, typename OutputIter>
65 OutputIter kruskal_mst(undirected_graph<vertex_t, edge_t>& G, OutputIter res) {
66 
67  disjoint_sets<vertex_t> sets;
68 
69  // vertex iterator
70  for(typename undirected_graph<vertex_t, edge_t>::vertex_iter it = G.vbegin(); it != G.vend(); it++)
71  sets.make_set(*it);
72 
73  std::list<edge_t> edges;
74 
75  // edge iterator
76  for(typename undirected_graph<vertex_t, edge_t>::edge_iter it = G.ebegin(); it != G.eend(); it++)
77  edges.push_back(*it);
78 
79  edges.sort();
80 
81  // expand and merge the components iteratively
82  for(edge_t edge : edges) {
83 
84  vertex_t u = edge.either(), v = edge.other();
85 
86  if(sets.find_set(u) != sets.find_set(v)) {
87  // Different component
88  sets.unite(u, v);
89  res++ = edge;
90  }
91  }
92 
93  return res;
94 }
95 
96 
97 struct edge_t {
98  long long u;
99  long long v;
100  long long int wt;
101  edge_t(long long a, long long b, long long weight) : u(a), v(b), wt(weight) { }
102  long long either() { return u; }
103  long long other() { return v; }
104  bool operator==(edge_t other) { return u == other.u and v == other.v; }
105  bool operator<(edge_t other) { return wt < other.wt; }
106 };
107 
108 int main() {
109 
110  undirected_graph<long long, edge_t> g;
111 
112  long long n, m, u, v, wt;
113  cin >> n >> m;
114  while(m--) {
115  cin >> u >> v >> wt;
116  edge_t e(u, v, wt);
117  g.add_edge(e);
118  }
119 
120  vector<edge_t> mst;
121  kruskal_mst(g, back_inserter(mst));
122 
123  long long cost = 0;
124  for(edge_t edge : mst)
125  cost += edge.wt;
126 
127  cout << cost << endl;
128 }
129 
130 
131 
132 
133 *******************************************************************************************************/
134 
135 
136 
137 
138 
139 
140 
141 
142 #endif
OutputIter kruskal_mst(graph &G, OutputIter res)
Definition: kruskal_mst.h:21