最小生成树

来源:互联网 发布:windows桌面插件api 编辑:程序博客网 时间:2024/06/10 06:49

根据大话数据结构整理:

/***********************************输入:邻接矩阵vMatrix/边表vEdge*输出:最小生成树***********************************/#include <iostream>#include <vector>#include <algorithm>using namespace std;#define INF 65535/*********Prim*************/void Prim(vector<vector<int>> &vMatrix){    vector<int> adjvex(vMatrix.size() + 1);    vector<int> lowcost(vMatrix.size() + 1);    for (unsigned i = 1; i < vMatrix.size(); i++)        lowcost[i] = vMatrix[0][i];    for (unsigned i = 1; i < vMatrix.size(); i++)    {        int min = INF;        unsigned j = 1, k = 0;        while (j < vMatrix.size())        {            if (lowcost[j] != 0 && lowcost[j] < min)            {                min = lowcost[j];                k = j;            }            j++;        }        cout << adjvex[k] << " " << k << endl;        lowcost[k] = 0;        for (j = 1; j < vMatrix.size(); j++)        {            if (lowcost[j] != 0 && lowcost[j] > vMatrix[k][j])            {                lowcost[j] = vMatrix[k][j];                adjvex[j] = k;            }        }    }}/*********Kruskal****************/struct CEdge{    int begin;    int end;    int weight;};bool sortEdge(CEdge a, CEdge b){    return a.weight < b.weight;}int Find(vector<int> &parent, int f){    while (parent[f]>0)        f = parent[f];    return f;}void Kruskal(vector<CEdge> &vEdge, int nodeNum){    vector<int> parent(nodeNum + 1);    for (unsigned i = 0; i < vEdge.size(); i++)    {        int n = Find(parent, vEdge[i].begin);        int m = Find(parent, vEdge[i].end);        if (n != m)        {            parent[n] = m;            cout << vEdge[i].begin << " "                << vEdge[i].end << " "                << vEdge[i].weight << endl;        }    }}/*********主函数****************/int main(){       int nodeNum, N, data1, data2, data3;    cin >> nodeNum >> N;    /******建立邻接矩阵**********/    vector<vector<int>> vMatrix(nodeNum, vector<int>(nodeNum, INF));    for (int j = 0; j < nodeNum; j++)        vMatrix[j][j] = 0;    /*******建立权值边***************/    vector<CEdge> vEdge(N);    for (int i = 0; i < N; i++)    {        cin >> data1 >> data2 >> data3;        vMatrix[data1][data2] = data3;        vMatrix[data2][data1] = data3;        vEdge[i].begin = data1;        vEdge[i].end = data2;        vEdge[i].weight = data3;    }    cout << "Prim最小生成树: " << endl;    Prim(vMatrix);    cout << "Kruskal最小生成树: " << endl;    sort(vEdge.begin(), vEdge.end(), sortEdge);    Kruskal(vEdge, nodeNum);    return 0;}/*case:顶点数n,边数m,m条边*//*9150 1 100 5 111 2 181 8 121 6 162 3 222 8 83 4 203 7 163 6 243 8 214 5 264 7 75 6 176 7 19*/ 

这里写图片描述

原创粉丝点击