Skip to content

Commit 6ab200a

Browse files
committed
feature: kruskal algo logic added
1 parent f78e0ea commit 6ab200a

File tree

3 files changed

+67
-8
lines changed

3 files changed

+67
-8
lines changed

Headers/0003_Graph/0007_MinimumSpanningTreeKruskalAlgorithm.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#include<map>
44
#include<vector>
5+
#include<list>
56
using namespace std;
67

78
namespace MinimumSpanningTreeKruskalAlgorithm
@@ -22,22 +23,25 @@ namespace MinimumSpanningTreeKruskalAlgorithm
2223
Node* nodeV;
2324
int weight;
2425
Edge(Node* nodeU, Node* nodeV, int weight);
25-
bool CompareEdges(Edge* edgeX, Edge* edgeY);
2626
};
2727

2828
class Graph
2929
{
3030
private:
3131
map<Node*, vector<Node*>> _adjlist;
3232
map<int, Node*> _nodeMap;
33+
vector<Edge*> _edgeList;
34+
vector<pair<pair<int, int>, int>> _minimumSpanningTree;
3335
Node* MakeOrFindNode(int data);
3436
void MakeSet(Node* node);
3537
void Union(Node* nodeU, Node* nodeV);
3638
void Link(Node* nodeU, Node* nodeV);
3739
Node* FindSet(Node* node);
3840

3941
public:
40-
void PushUndirectedEdge(int valueU, int valueV);
42+
void PushUndirectedEdge(int valueU, int valueV, int weight);
4143
void FindMinimumSpanningTreeKruskalAlgorithm();
44+
vector<pair<pair<int, int>, int>> GetMinimumSpanningTree();
45+
vector<Edge*> GetSortedEdgeList();
4246
};
4347
}

SourceCodes/0003_Graph/0007_MinimumSpanningTreeKruskalAlgorithm.cc

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "../Headers/0003_Graph/0007_MinimumSpanningTreeKruskalAlgorithm.h"
22
#include<climits>
3+
#include<algorithm>
34
using namespace std;
45

56
namespace MinimumSpanningTreeKruskalAlgorithm
@@ -17,11 +18,6 @@ namespace MinimumSpanningTreeKruskalAlgorithm
1718
this->nodeV = nodeV;
1819
this->weight = weight;
1920
}
20-
21-
bool Edge::CompareEdges(Edge* edgeX, Edge* edgeY)
22-
{
23-
return (edgeX->weight < edgeY->weight);
24-
}
2521

2622
// Graph Private Member Methods
2723
Node* Graph::MakeOrFindNode(int data)
@@ -76,12 +72,41 @@ namespace MinimumSpanningTreeKruskalAlgorithm
7672
}
7773

7874
// Graph Public Member Methods
79-
void Graph::PushUndirectedEdge(int dataU, int dataV)
75+
void Graph::PushUndirectedEdge(int dataU, int dataV, int weight)
8076
{
8177
Node* nodeU = this->MakeOrFindNode(dataU);
8278
Node* nodeV = this->MakeOrFindNode(dataV);
8379

8480
this->_adjlist[nodeU].push_back(nodeV);
8581
this->_adjlist[nodeV].push_back(nodeU);
82+
this->_edgeList.push_back(new Edge(nodeU, nodeV, weight));
83+
}
84+
void Graph::FindMinimumSpanningTreeKruskalAlgorithm()
85+
{
86+
for (auto iterator : this->_nodeMap)
87+
{
88+
this->MakeSet(iterator.second);
89+
}
90+
91+
sort(this->_edgeList.begin(), this->_edgeList.end(), [](Edge* edgeX, Edge* edgeY) {return edgeX->weight < edgeY->weight; });
92+
93+
for (auto edge : this->_edgeList)
94+
{
95+
if (this->FindSet(edge->nodeU) != this->FindSet(edge->nodeV))
96+
{
97+
this->Union(edge->nodeU, edge->nodeV);
98+
this->_minimumSpanningTree.push_back({ {edge->nodeU->data, edge->nodeV->data}, edge->weight });
99+
}
100+
}
101+
}
102+
103+
vector<pair<pair<int, int>, int>> Graph::GetMinimumSpanningTree()
104+
{
105+
return this->_minimumSpanningTree;
106+
}
107+
108+
vector<Edge*> Graph::GetSortedEdgeList()
109+
{
110+
return this->_edgeList;
86111
}
87112
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#include<gtest/gtest.h>
2+
#include<0003_Graph/0007_MinimumSpanningTreeKruskalAlgorithm.h>
3+
4+
namespace MinimumSpanningTreeKruskalAlgorithm
5+
{
6+
TEST(MST, Kruskal)
7+
{
8+
Graph graph;
9+
10+
graph.PushUndirectedEdge(1, 2, 4);
11+
graph.PushUndirectedEdge(1, 8, 8);
12+
graph.PushUndirectedEdge(2, 8, 11);
13+
graph.PushUndirectedEdge(2, 3, 8);
14+
graph.PushUndirectedEdge(3, 4, 7);
15+
graph.PushUndirectedEdge(3, 9, 2);
16+
graph.PushUndirectedEdge(3, 6, 4);
17+
graph.PushUndirectedEdge(4, 5, 9);
18+
graph.PushUndirectedEdge(4, 6, 14);
19+
graph.PushUndirectedEdge(5, 6, 10);
20+
graph.PushUndirectedEdge(6, 7, 2);
21+
graph.PushUndirectedEdge(7, 8, 1);
22+
graph.PushUndirectedEdge(7, 9, 6);
23+
graph.PushUndirectedEdge(8, 9, 7);
24+
25+
graph.FindMinimumSpanningTreeKruskalAlgorithm();
26+
27+
auto res1 = graph.GetSortedEdgeList();
28+
auto res2 = graph.GetMinimumSpanningTree();
29+
}
30+
}

0 commit comments

Comments
 (0)