#include<iostream>
#include<fstream>
using namespace std;
#define MAX 100
#define MAXCOST 0x7fffffff
int graph[MAX][MAX];
//lowcost[]数组表示从现在的mst集合到剩下各个点的距离,因此有多少个点则lowcost的数组就有多大
//mst[i]数组表示,i结点的溯源结点,例如mst[3]=1表示两个意思,【1】3为mst集合中的一个点【2】在在最小生成树中是由结点1到结点3的
int prim(int graph[][MAX], int n)
{
int lowcost[MAX];
int mst[MAX];
int i, j, min, minid, sum = 0;
//默认结点1为起始节点
for (i = 2; i <= n; i++)
{
//此时mst集合中只有结点1,因此初始化lowcost[]数组,数组中存放的是由mst到各个点的最短距离
lowcost[i] = graph[1][i];
mst[i] = 1;
}
mst[1] = 0;
for (i = 2; i <= n; i++) //要找出n-1个点为止
{
min = MAXCOST;
minid = 0;
//选取距离最小的点,将该点存入mst,并且将lowcost中该点对应的值为0
for (j = 2; j <= n; j++)
{
if (lowcost[j] < min && lowcost[j] != 0)
{
min = lowcost[j];
minid = j;
}
}
cout << "V" << mst[minid] << "-V" << minid << "=" << min << endl;
sum += min;
lowcost[minid] = 0;
//由于mst更新,因此lowcost也应该更新
for (j = 2; j <= n; j++)
{
if (graph[minid][j] < lowcost[j])
{
lowcost[j] = graph[minid][j];
mst[j] = minid; //点j到MST内的lowcot对应的MST里的点事minid
}
}
}
return sum;
}