C++Kruskal算法

余祥宣, 崔国华, 邹海明. 计算机算法基础.3版[M]. 华中科技大学出版社, 2006.
P117 算法5.9
程序的输入是一个名字为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 PARENT[MAX];

void Union(int i, int j)
{
    int x = PARENT[i] + PARENT[j];
    if (PARENT[i] < PARENT[j])
    {
        PARENT[i] = x;
        PARENT[j] = i;
    }
    else
    {
        PARENT[j] = x;
        PARENT[i] = j;
    }
}

int Find(int i)
{
    int j = i;
    while (PARENT[j] > 0)
    {
        j = PARENT[j];
    }
    return j;
}

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 Kruskal(int COST[][MAX], int n, int T[][2], int &mincost)
{
    for (int i = 1; i <= n; i++)
        PARENT[i] = -1;
    int i = 0;
    mincost = 0;
    int u, v,j,k;
    while (i < n - 1)
    {
        FindMinCost(COST, n, u, v);
        j = Find(u);
        k = Find(v);

        if (j != k)
        {
            i++;
            T[i][1] = u;
            T[i][2] = v;
            mincost = mincost + COST[u][v];
            cout << "V" << T[i][1] << "->V" << T[i][2] << " COST=" << COST[u][v] << " Total=" << mincost << endl;
            Union(j, k);
        }
        COST[u][v] = MAXCOST;
    }

    if (i != n-1)
        cout << "NO SPANNING TREE\n";
}

int main()
{
    int i, j, k, m, n, cost;
    ifstream in("input.txt");
    in >> m >> n;
    for (i = 0; i <= m; i++)
    {
        for (j = 0; j <= m; j++)
        {
            COST[i][j] = MAXCOST;
        }
    }

    for (k = 1; k <= n; k++)
    {
        in >> i >> j >> cost;
        COST[i][j] = cost;
        COST[j][i] = cost;
    }

    int t[MAX][2], mincost = MAXCOST;
    Kruskal(COST, m, t, mincost);

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

运行结果
C++Kruskal算法运行结果1
C++Kruskal算法运行结果2

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值