//算法名称:最小生成图
//算法思路:prim算法
#include "stdafx.h"
#include<iostream>
#include<fstream>
using namespace std;
int prim(int **graph, int n);
const int MAXCOST = 0x7FFFFFFF;
int main()
{
int vertexNum, edgeNum;
ifstream in("input.txt");
in >> vertexNum >> edgeNum;//vertexNum=顶点的个数,edgeNum=边的个数
//根据顶点数,动态创建二维数组,主要我们的索引从1开始
int ** graph = new int* [vertexNum+1];
for (int i = 0;i<=vertexNum;i++)
graph[i] = new int [vertexNum+1];
//构建图G
//初始化
for (int i = 0;i<=vertexNum;i++)
for (int j = 0;j<=vertexNum;j++)
graph[i][j] = MAXCOST;
int i(0),j(0),value(0);
for (int k = 1; k <= edgeNum; k++)
{
in >> i >> j >> value;
graph[i][j] = value;
graph[j][i] = value;
}
//求解最小生成树
int cost = prim(graph, vertexNum);
//输出最小权值和
cout << "最小权值和=" << cost << endl;
//释放资源
for (int i = 0;i<=vertexNum;i++)
delete [] graph[i];
delete [] graph;
system("pause");
return 0;
}
int prim(int **graph, int n)
{
int *lowcost = new int[n];
int *mst = new int[n];
int i, j, min, minid, sum = 0;
//初始化
for (i = 2; i <= n; i++)
{
lowcost[i] = graph[1][i];
mst[i] = 1;
}
mst[1] = 0;
//再循环n-1次
for (i = 2; i <= n; i++)
{
//找到最小值
min = MAXCOST;
minid = 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; //将新的点设为0,
//新点加入后,只需要计算新点与所有点的权,因为以前的lowcost存储的就是
//之前所有新加入点到未加入点的最小值。
for (j = 2; j <= n; j++)
{
if (graph[minid][j] < lowcost[j])
{
lowcost[j] = graph[minid][j];
mst[j] = minid;
}
}
}
return sum;
}