数据结构练习_Kruskal算法

// 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 >adjacencyMatrix;
    vector MSTArray;
    vectorparent;
    priority_queue queue;
    vector vertexName;
};

template
Graph::Graph(int * vertexArray, T *nameOfVertex, int numberOfVertex) {
    vertexNum = numberOfVertex;
    arcNum = 0;
    for (int i = 0; i < vertexNum; i++) {
        parent.push_back(i);
        vertexName.push_back(nameOfVertex[i]);
    }
    adjacencyMatrix.resize(vertexNum, vector(vertexNum));
    for (int i = 0; i < vertexNum; i++) {
        for(int j = 0 ; j         adjacencyMatrix[i][j] = *(vertexArray + i* vertexNum + 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::FindSet(int index) {
    if (index == parent[index])
        return index;
    else
        return FindSet(parent[index]);
}

template
void Graph::UnionSet(int vertexFrom, int vertexTo) {
    vertexFrom = FindSet(vertexFrom);
    vertexTo = FindSet(vertexTo);
    if (vertexFrom != vertexTo)
        parent[vertexFrom] = vertexTo;
}

template
void Graph::KruksalMst() {
    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 g(*cost, verName, numofVertex);
    cout << "Kruskal 算法执行结果:" << "\n";
    try {
        g.KruksalMst();
    }
    catch (char *) {
        cout << "Kruskal算法执行失败!" << endl;
    }
    system("pause");
    return 0;
}

你可能感兴趣的:(数据结构练习_Kruskal算法)