最小生成树--Prim算法

       Prim算法:用邻接矩阵存储图,设置两个数组lowCost和adjIndex,其中前者代表边的权值,后者代表对应lowCost该边的起点。具体内容参考严蔚敏的数据结构图7.17。

#include<iostream>
using namespace std;

int graph[20][20];//邻接矩阵
char * vertex;//保存顶点

int Prim(int&);

int main()
{

/*

6 10

A B C D E F

0 1 6
0 2 1
0 3 5
1 2 5
1 4 3
3 2 5
3 5 2
2 5 4
2 4 6
4 5 6

*/

	//////1.输入图的顶点数和弧数
	cout << "请输入图的顶点数和弧数: ";
	int vexNum, arcNum;
	cin >> vexNum >> arcNum;

	//////2.初始化邻接矩阵
	for (int i = 0; i < vexNum; i++)
		for (int j = 0; j < vexNum; j++)
			graph[i][j] = INT_MAX;//无限大

	/////3.输入顶点
	cout << "请输入" << vexNum << "个顶点信息: ";
	vertex = new char[vexNum];
	for (int i = 0; i < vexNum; i++)
		cin >> vertex[i];

	//////4.输入弧信息(边的方向和权值)
	cout << "请输入" << arcNum << "个弧的信息: \n";
	int a, b, c;
	for (int i = 0; i < arcNum; i++)
	{
		cin >> a >> b >> c;
		graph[a][b] = c;
		graph[b][a] = c;
	}
	
	//////5.输出最小生成树
	cout << "\n\n最小树为: \n";
	int x = Prim(vexNum);
	cout << "\n最小权和为" << x << endl<<endl;

	return 0;
}

int Prim(int & _vexNum)//Prim最小生成树
{
	int * lowCost = new int[_vexNum];//保存边上的权值
	int * adjIndex = new int[_vexNum];//
	
	for (int i = 1; i < _vexNum; i++)
	{
		lowCost[i] = graph[0][i];
		adjIndex[i] = 0;
	}
	lowCost[0] = 0;
	adjIndex[0] = 0;

	int min, minIndex,sum=0;
	for (int i = 1; i < _vexNum; i++)
	{
		min = INT_MAX;
		for (int j = 1; j < _vexNum; j++)//找到权值最小
		{
			if (lowCost[j] < min && lowCost[j]!=0)
			{
				min = lowCost[j];
				minIndex = j;
			}
		}

		cout << vertex[adjIndex[minIndex]] << "------>" << vertex[minIndex] << endl;
		sum += min;
		lowCost[minIndex] = 0;
		adjIndex[minIndex] = 0;

		for (int j = 1; j < _vexNum; j++)//更新lowCost和adjIndex数组
		{
			if (graph[minIndex][j] < lowCost[j])
			{
				lowCost[j] = graph[minIndex][j];
				adjIndex[j] = minIndex;
			}
		}
	}
	
	delete []lowCost;
	delete []adjIndex;

	return sum;
}

以上代码所构建的图为:

最小生成树--Prim算法_第1张图片


运行如下:



以上代码参考严蔚敏的数据结构和 http://blog.csdn.net/yeruby/article/details/38615045



你可能感兴趣的:(数据结构,C++,Prim,邻接矩阵,MST)