This program takes an input WAM, and applies Kruskal’s and Prim’s algorithms to it.
///////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <vector>
#include <sstream>
///////////////////////////////////////////////////////////////////////////////
struct Edge
{
int vertOne, vertTwo, weight;
Edge(int one, int two, int passedWeight)
{
this->vertOne = one;
this->vertTwo = two;
this->weight = passedWeight;
}
};
class Vertex
{
private:
std::vector<Edge*> edges;
int position;
public:
Vertex(void);
Vertex(int pos);
~Vertex();
Edge* addEdge(int secondVert, int weight);
std::vector<Edge*> getEdges(void);
int getPos(void);
void printEdges(void);
};
///////////////////////////////////////////////////////////////////////////////
int CreateAdjMatrix(std::vector<Vertex*> &theVertices, std::vector<Edge*>
&theEdges);
void KruskalsAlgorithm(std::vector<Vertex*> theVertices, std::vector<Edge*>
theEdges);
///////////////////////////////////////////////////////////////////////////////
int main(void)
{
std::vector<Vertex*> theVertices;
std::vector<Edge*> theEdges;
if(CreateAdjMatrix(theVertices, theEdges))
{
exit(1);
}
std::cout << "Printing adjacency matrix: \n\n\n\n\n\n";
for(auto it : theVertices)
{
it->printEdges();
}
std::cout << "\n\n\n\n\n Printing sorted edges \n\n\n\n\n";
for(auto it : theEdges)
{
std::cout << "\n\n\n\nVertex One: " << it->vertOne;
std::cout << "\nVertex Two: " << it->vertTwo;
std::cout << "\nWeight: " << it->weight;
}
KruskalsAlgorithm(theVertices, theEdges);
return 0;
}
///////////////////////////////////////////////////////////////////////////////
Vertex::Vertex(void)
{
}
///////////////////////////////////////////////////////////////////////////////
Vertex::Vertex(int pos)
{
this->position = pos;
}
///////////////////////////////////////////////////////////////////////////////
Vertex::~Vertex()
{
for(auto it = edges.begin(); it != edges.end(); it++)
{
delete (*(it));
}
}
///////////////////////////////////////////////////////////////////////////////
int Vertex::getPos(void)
{
return this->position;
}
///////////////////////////////////////////////////////////////////////////////
Edge* Vertex::addEdge(int secondVert, int weight)
{
Edge *edgeBuff = new Edge(this->getPos(), secondVert, weight);
this->edges.push_back(edgeBuff);
return edgeBuff;
}
///////////////////////////////////////////////////////////////////////////////
std::vector<Edge*> Vertex::getEdges(void)
{
return this->edges;
}
///////////////////////////////////////////////////////////////////////////////
void Vertex::printEdges(void)
{
for(auto it : this->edges)
{
std::cout << it->weight << " ";
}
std::cout << std::endl;
return;
}
///////////////////////////////////////////////////////////////////////////////
int CreateAdjMatrix(std::vector<Vertex*> &theVertices, std::vector<Edge*>
&theEdges)
{
std::string inBuff;
int pos = 0, weight, vertexCount;
Edge *edgeBuff;
Vertex *vertBuff = new Vertex;
theVertices.push_back(vertBuff);
std::cout << "Enter WAM:\n"; std::getline(std::cin, inBuff); std::istringstream iss(inBuff); // use stringstream to parse while(iss >> weight) // while stringstreaming and casting to int
{
pos++;
edgeBuff = vertBuff->addEdge(pos, weight);
if(theEdges.size() == 0)
{
theEdges.push_back(edgeBuff);
}
else
{
for(auto it = theEdges.begin(); it != theEdges.end(); it++)
{
if((*(it))->weight <= edgeBuff->weight)
{
theEdges.insert(it, edgeBuff); // insert into sort
it = (theEdges.end() - 1); // break the for loop
}
}
}
}
vertexCount = pos;
try
{
for(int i = 1; i < vertexCount; i++) { pos = 0; vertBuff = new Vertex(i); // add a new vertex for the row theVertices.push_back(vertBuff); // add it to the vertex vector std::getline(std::cin, inBuff); // parse the input weights std::istringstream iss(inBuff); // use stringstream to parse while(iss >> weight) // while stringstreaming and casting to int
{
pos++;
if(pos > vertexCount) // there are too many vertices
{
throw 1;
}
edgeBuff = vertBuff->addEdge(pos, weight); // add the edge
for(auto it = theEdges.begin(); it != theEdges.end(); it++)
{
if((*(it))->weight <= edgeBuff->weight)
{
theEdges.insert(it, edgeBuff); // insert into sort
it = (theEdges.end() - 1); // break the for loop
}
}
}
if(pos != vertexCount) // We know there are too few vertices
{
throw 2;
}
}
}
catch(int n)
{
if(n == 2)
{
std::cout << "Too few vertices in this row, exiting now\n";
}
if(n == 1)
{
std::cout << "Too many vertices in this row, exiting now\n";
}
return 1;
}
return 0;
}
///////////////////////////////////////////////////////////////////////////////
void KruskalsAlgorithm(std::vector<Vertex*> theVertices,
std::vector<Edge*> theEdges)
{
std::vector visitedNode(theVertices.size(), false);
int i = 0;
for(auto it = theEdges.end(); it != theEdges.begin(); it--)
{
std::cout << "\n\n\n\n" << ++i;
if(!visitedNode[(*(it))->vertOne])
{
visitedNode[(*(it))->vertOne] = true;
}
if(!visitedNode[(*(it))->vertTwo])
{
visitedNode[(*(it))->vertTwo] = true;
}
theEdges.erase(it);
}
return;
}
///////////////////////////////////////////////////////////////////////////////
void PrimsAlgorithm(std::vector<Vertex*> theVertices, theEdges);
{
Vertex *currentVert;
bool visitedNodes[theVertices.size()];
Edge* leastEdge;
std::vector<Edge*> edgeBuff;
visitedNodes[0] = true;
for(int i = 0; i < theVertices.size(); i++) { edgeBuff = theVertices[i]->getEdges();
leastEdge = edgeBuff[0];
for(int j = 1; j < theVertices.size(); j++)
{
if(edgeBuff[j]->weight < leastEdge->weight)
{
if(!visitedNodes[edgeBuff[j]->vertTwo])
{
leastEdge = edgeBuff[j];
}
}
}
visitedNodes[j] = true;
currentVert = theVertices[j];
}
return;
}