/*-------------------------------------------------------------------
* Purpose:
* 使用prim算法求最小生成树
* 使用图为算法导论第二版p344 图23-1
* Time:
* 2012年3月19日 20:58:28
* Author:
* 张彦升
--------------------------------------------------------------------*/
#include <iostream>
using namespace std;
#define V 9 /*点的个数*/
const int inf = 0x3f3f3f3f;
int vis[V];
int lowc[V]; /*最低代价*/
int prim(int cost[][V],int n)
{
int minc = 0,res = 0;
memset(vis,0,sizeof(vis));
vis[0] = 1;
for (int i = 1;i < n;i++)
{
/*初始化为由初始顶点到所有节点的所有代价*/
lowc[i] = cost[0][i];
}
int p = -1;
for (int i = 1;i < n;i ++)
{
minc = inf;
p = -1;
/*循环找到代价最小的一个顶点,并记录其顶点位置*/
for (int j = 0;j < n;j++)
{
if (0 == vis[j] && minc > lowc[j])
{
minc = lowc[j];
p = j;
}
}
if (inf == minc)
{
return -1;
}
cout << p << "(" << minc << ") ";
res += minc;
vis[p] = 1; /*已被访问*/
for (int j = 0;j < n;j++)
{
/*重置记录数值*/
if (0 == vis[j] && lowc[j] > cost[p][j])
{
lowc[j] = cost[p][j];
}
}
}
cout << endl;
return res;
}
int main()
{
int cost[V][V] = {
/* a b c d e f g h i*/
{inf,4,inf,inf,inf,inf,inf,8,inf},
{4,inf,8,inf,inf,inf,inf,11,inf},
{inf,8,inf,7,inf,4,inf,8,2},
{inf,4,7,inf,9,14,inf,8,inf},
{inf,4,inf,9,inf,10,inf,8,inf},
{inf,inf,4,14,10,inf,2,8,inf},
{inf,inf,inf,inf,inf,2,inf,1,6},
{8,11,inf,inf,inf,inf,1,inf,7},
{inf,inf,2,inf,inf,inf,6,7,inf},
};
int res = prim(cost,V);
cout << res << endl;
return 0;
}
图论---prim算法
最新推荐文章于 2022-10-30 16:40:37 发布