// Graph_Kruskal.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include
#include
#include
#include
using namespace std;
struct EdgeNode {
int from;
int to;
int weight;
friend bool operator < (EdgeNode a, EdgeNode b) {
return a.weight > b.weight;
}
};
template
class Graph {
public :
Graph(int *vertexArray, T * nameOfVertex, int numberOfVertex);
void KruksalMst();
int FindSet(int index);
void UnionSet(int vertexFrom, int vertexTo);
private:
int vertexNum, arcNum;
vector
vector
vector
priority_queue
vector
};
template
Graph
vertexNum = numberOfVertex;
arcNum = 0;
for (int i = 0; i < vertexNum; i++) {
parent.push_back(i);
vertexName.push_back(nameOfVertex[i]);
}
adjacencyMatrix.resize(vertexNum, vector
for (int i = 0; i < vertexNum; i++) {
for(int j = 0 ; j
}
EdgeNode tempEdgeNode;
for (int i = 0; i < vertexNum; i++) {
for (int j = 0; j < i; j++) {
if (adjacencyMatrix[i][j] < INT_MAX) {
tempEdgeNode.from = i;
tempEdgeNode.to = j;
tempEdgeNode.weight = adjacencyMatrix[i][j];
queue.push(tempEdgeNode);
arcNum++;
}
}
}
}
template
int Graph
if (index == parent[index])
return index;
else
return FindSet(parent[index]);
}
template
void Graph
vertexFrom = FindSet(vertexFrom);
vertexTo = FindSet(vertexTo);
if (vertexFrom != vertexTo)
parent[vertexFrom] = vertexTo;
}
template
void Graph
while (MSTArray.size() != vertexNum - 1) {
if (FindSet(queue.top().from) != FindSet(queue.top().to)) {
MSTArray.push_back(queue.top());
UnionSet(queue.top().from, queue.top().to);
}
queue.pop();
}
for (int i = 0; i < vertexNum - 1; ++i) {
cout << vertexName[MSTArray[i].from] << "--->" << vertexName[MSTArray[i].to]<<" ";
}
}
int main(int argc , char * argv[])
{
const int numofVertex = 7;
int cost[numofVertex][numofVertex] = {
{INT_MAX , 12,5,11,INT_MAX ,INT_MAX, INT_MAX},
{12,INT_MAX,INT_MAX,INT_MAX,33,INT_MAX,INT_MAX},
{5,INT_MAX,INT_MAX,21,INT_MAX,19,INT_MAX},
{11,INT_MAX,21,INT_MAX,28,8,INT_MAX},
{INT_MAX,33,INT_MAX,28,INT_MAX,INT_MAX,6},
{INT_MAX,INT_MAX,19 , 8,INT_MAX,INT_MAX,16},
{INT_MAX,INT_MAX,INT_MAX,INT_MAX,6,16,INT_MAX}
};
string verName[numofVertex] = { "A","B","C","D","E","F","G" };
Graph
cout << "Kruskal 算法执行结果:" << "\n";
try {
g.KruksalMst();
}
catch (char *) {
cout << "Kruskal算法执行失败!" << endl;
}
system("pause");
return 0;
}