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 
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);
}

你可能感兴趣的:(图论,数据结构,算法,c++)