C++Prim最小生成树算法

余祥宣, 崔国华, 邹海明. 计算机算法基础.3版[M]. 华中科技大学出版社, 2006.
P114 算法5.7
程序的输入是一个名字为input.txt的文件,保存时注意编码格式再VS上运行的话要保存为ANSI编码,如果需要的话我可以上传一份

6 10
1 2 10
1 4 30
1 5 45
2 3 50
2 5 40
2 6 25
3 5 35
3 6 15
4 6 20
5 6 55

结点数6 边数10
顶点1 顶点2 权值

6 10
1 2 6
1 3 1
1 4 5
2 3 5
2 5 3
3 4 5
3 5 6
3 6 4
4 6 2
5 6 6

#include<iostream>
#include<fstream>
using namespace std;

#define MAX 8//最大顶点数
#define MAXCOST 0x7fffffff

int COST[MAX][MAX];
int NEAR[MAX];
void FindMinCost(int COST[][MAX],int n, int &k,int &l)
{
    int min = COST[1][1];
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= i; j++)
        {
            if (min > COST[i][j]) 
            {
                min = COST[i][j];
                k = i;
                l = j;
            }
        }
    }
}
void Prim(int COST[][MAX],int n,int T[][2], int &mincost)
{
    int k, l,i,j;
    //寻找最小成本的边
    FindMinCost(COST,n,k,l);
    mincost = COST[k][l];
    T[1][1] = k, T[1][2] = l;
    cout << "V" << T[1][1] << "->V" << T[1][2] << " COST=" << COST[k][l] << " Total=" << mincost << endl;

    for (i = 1; i <= n; i++)
    {
        if (COST[i][l] < COST[i][k])
            NEAR[i] = l;
        else
            NEAR[i] = k;
    }

    NEAR[k] = NEAR[l] =0;
    NEAR[0] = 0;

    for (i = 2; i <= n - 1; i++)
    {
        //寻找满足条件的j
        j = 0;
        for (int index = 1; index <= n; index++)
        {
            if (NEAR[index] != 0&&COST[index][NEAR[index]]<COST[j][NEAR[j]])
            {
                j = index;
            }
        }

        T[i][1] = j;
        T[i][2] = NEAR[j];
        mincost = mincost + COST[j][NEAR[j]];
        cout << "V" << T[i][1] << "->V" << T[i][2] <<" COST="<< COST[j][NEAR[j]]<<" Total="<<mincost<< endl;
        NEAR[j] = 0;

        for (k = 1; k <= n; k++)
        {
            if (NEAR[k] != 0 && COST[k][NEAR[k]] > COST[k][j])
                NEAR[k] = j;
        }
    }

    if (mincost >= MAXCOST)
        cout << "NO SPANNING TREE\n";
}
int main()
{
    int i, j, k, m, n,cost;
    ifstream in("input.txt");
    in >> m >> n;//m=顶点的个数,n=边的个数
    //初始化图G
    for (i = 0; i <= m; i++)
    {
        for (j = 0; j <= m; j++)
        {
            COST[i][j] = MAXCOST;
        }
    }
    //构建图G
    for (k = 1; k <= n; k++)
    {
        in >> i >> j >> cost;
        COST[i][j] = cost;
        COST[j][i] = cost;
    }

    //求解最小生成树
    int t[MAX][2], mincost=MAXCOST;
    Prim(COST, m,t,mincost);

    //输出最小权值和
    cout << "最小权值和=" << mincost << endl;
    system("pause");
    return 0;
}

运行结果
C++Prim最小生成树算法运行结果1
C++Prim最小生成树算法运行结果2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值