1. 最小生成树的权值之和

  1. 1. 最小生成树的权值之和

【问题描述】
 已知含有n个顶点的带权连通无向图,采用邻接矩阵存储,邻接矩阵以三元组的形式给出,只给出不包括主对角线元素在内的下三角形部分的元素,且不包括不相邻的顶点对。请采用Prim算法,求该连通图从1号顶点出发的最小生成树的权值之和。
【输入形式】
 第一行给出结点个数n和三元组的个数count,以下每行给出一个三元组,数之间用空格隔开。(注意这里顶点的序号是从1到n,而不是0到n-1,程序里要小心!)
【输出形式】
 求解的最小生成树的各条边、边的权值之和
【样例输入】
 5 8
 2 1 7
 3 1 6
 3 2 8
 4 1 9
 4 2 4
 4 3 6
 5 2 4
 5 4 2
【样例输出】

1-3:6
3-4:6
4-5:2
4-2:4
18

【样例说明】
 权值是正整数,可能很大,但不需要考虑整型溢出问题

#include <bits/stdc++.h>
using namespace std;
#define max 0x7fffffff;
struct graph
{
    int arc[200][200];
    int vexnum, arcnum;
};
struct a
{
    int adj;
    int lowcost;
} edge[200];
void create(graph *g)
{
    cin >> g->vexnum >> g->arcnum;
    for (int i = 1; i <= g->vexnum; i++)
        for (int j = 1; j <= g->vexnum; j++)
            g->arc[i][j] = max;
    int weight, i, j;
    for (int k = 0; k < g->arcnum; k++)
    {
        cin >> i >> j >> weight;
        g->arc[i][j] = weight;
        g->arc[j][i] = weight;
    }
}
int findmin(graph g)
{
    int index = -1;
    int min = max;
    for (int i = 1; i <= g.vexnum; i++)
    {
        if (min > edge[i].lowcost && edge[i].lowcost != 0)
        {
            min = edge[i].lowcost;
            index = i;
        }
    }
    return index;
}
void prime(graph g, int vex)
{
    int sum = 0;
    int k;
    for (int j = 1; j <= g.vexnum; j++)
    {
        edge[j].adj = vex;
        edge[j].lowcost = g.arc[vex][j];
    }
    edge[vex].lowcost = 0;
    for (int i = 1; i < g.vexnum; i++)
    {
        k = findmin(g);
        sum += edge[k].lowcost;
        cout << edge[k].adj << "-" << k << ":" << edge[k].lowcost << endl;
        edge[k].lowcost = 0;
        for (int i = 1; i <= g.vexnum; i++)
        {
            if (g.arc[k][i] < edge[i].lowcost)
            {
                edge[i].adj = k;
                edge[i].lowcost = g.arc[k][i];
            }
        }
    }
    cout << sum;
}
int main()
{
    graph g;
    create(&g);
    prime(g, 1);
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wrong Ansewer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值