大一数据结构作业样例---------极易复用和修改,代码简单不易被老师识破之Prim算法,输入节点总数,弧数和邻接矩阵获得最终的最小生成树

#include<iostream>
using namespace std;
const int MAXSIZE = 10;
class MGraph
{
public:
    MGraph();
int vNum, arcNum;int arcs[MAXSIZE][MAXSIZE];
private:
    string vertex[MAXSIZE];
    
    
};
MGraph::MGraph()
{
    cin >> vNum;
    cin >> arcNum;
    for (int i = 0; i < vNum; i++)
    {
        for (int j = 0; j < vNum; j++)
        {
            cin >> arcs[i][j];
        }
    }
}
class Prim
{
private:
    int adjvex[MAXSIZE];
    int lowcost[MAXSIZE];
public:
    Prim(MGraph G);
    int minimum(MGraph G, int lowcost[]);
    int GetMax(MGraph G);
    void Traverse(MGraph G);
};
void Prim::Traverse(MGraph G)
{
    for (int i = 0; i < G.vNum; i++)
    {
        std::cout << adjvex[i] << ' ';
    }
}

int Prim::GetMax(MGraph G)
{
    int k = 0;
    for (int i = 0; i < G.vNum; i++)
    {
        for (int j = 0; j < G.vNum; j++)
        {
            if (k < G.arcs[i][j])
            {
                k = G.arcs[i][j];
            }
        }
    }
    return k;
}
int Prim::minimum(MGraph G, int lowcost[])
{
    int min = GetMax(G);
    int k = 0;
    for (int i = 1; i < G.vNum; i++)
    {
        if (lowcost[i] != 0 && lowcost[i] < min)
        {
            min = lowcost[i];
            k = i;
        }
    }
    return k;
}

Prim::Prim(MGraph G)
{
    for (int i = 0; i < G.vNum; i++)
    {
        adjvex[i] = 0; lowcost[i] = G.arcs[0][i];//lowcost存储针对每个顶点的所有弧的邻接矩阵的某一列数据的首个
    }
    lowcost[0] = 0;//初始化V0的lowcost值为0表示已经遍历
    for (int i = 1; i < G.vNum; i++)
    {
        int k = minimum(G, lowcost);//minimum函数的作用是取得当前所有可连得新节点边中权值最小的节点
        std::cout << 'V' << adjvex[k] << "->V" << k << std::endl;
        lowcost[k] = 0;//表示该节点已经被遍历
        for (int j = 0; j < G.vNum; j++)
        {
            if (lowcost[j] != 0 && G.arcs[k][j] < lowcost[j])
            {
                lowcost[j] = G.arcs[k][j];//如果新加入的点针对某个其他节点的权值更小,则替换
                adjvex[j] = k;//记录用的是谁的遍历
            }
        }
    }
}
int main()
{
    MGraph G;
    Prim a(G);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值