当前位置:文档之家› 贪心算法实验(最小生成树)

贪心算法实验(最小生成树)

算法分析与设计实验报告第一次附加实验
{
Type lowcost[N+1]; // 记录 c[j][closest]的最小权值 int
closest[N+1]; //V-S中点j在中的最临接顶点
bool s[N+1]; //标记各结点是否已经放入集合s中
s[1]= true ;
// 初始化 s[i],lowcost[i],closest[i]
for (i nt i=2;i<=n ;i++)
{
lowcost[i]=c[1][i];
closest[i]=1;
s[i]= false ;
}
for (i nt i=1;i <n ;i++)
{
Type min=inf;
int j=1;
for (int k=2;k<=n;k++) // 找出 V-S 中是lowcost 最小的顶

j
{
if((lowcost[k]<min)&&(!s[k])) // 如果 k 的 lowcost 比min小并且k结点没有被访问
附录:
完整代码(贪心法)
//贪心算法最小生成树prim算法
#include <iostream>
#inelude <fstream>
#inelude <string>
#inelude <time.h>
#include <iomanip>
using namespace std;
#define inf 9999; //定义无限大的值const int N=6;
template < class Type> // 模板定义
void Prim( int n,Type c[][N+1]);
int mai n()
{
int c[N+1][N+1];
cout<< "连通带权图的矩阵为:"<<endl;
for (int i=1;i<=N;i++) // 输入邻接矩阵
for (int j=1;j<=N;j++)
{
cin>>c[i][j];
}
}
cout<< "Prim 算法最小生成树选边次序如下: " <<endl;
clock_t start,end,over; // 计算程序运行时间的算法
start=clock();
end=clock();
over=end-start;
start=clock();
Prim(N,c); // 调用 Prim 算法函数
end=clock();
printf( "The time is %6.3f" ,(double )(end-start-
// 显示over)/CLK_TCK); 运行时间
cout<<endl;
system( "pause" );
return 0;
}
template < class Type>
//参数为结点个数n,和无向带权图中各结点之间的距离c[][N+1] void Prim( int n,Type c[][N+1])
{
Type lowcost[N+1]; // 记录c[j][closest]的最小权值
int closest[N+1]; //V-S中点j在s中的最临接顶点
bool s[N+1]; //标记各结点是否已经放入S集合|
s[1]= true ;
// 初始化 s[i],lowcost[i],closest[i]
for (int i=2;i<=n;i++)
{
lowcost[i]=c[1][i];
closest[i]=1;
s[i]= false;
}
for (int i=1;i<n;i++)
{
Type min=inf;
int j=1;
for (int k=2;k<=n;k++) // 找出 V-S 中是lowcost 最小的顶点 j
{
if ((lowcost[k]<min)&&(!s[k])) // 如果 k 的 lowcost 比min 小并
且 k结
点没有被访问
{
min=lowcost[k]; // 更新 min 的值
j=k;
}
}
coutvvjvv ' ' <<closest[j]vvendl; // 输出 j和最邻近 j的点
s[j]= true ; // 将j添加到 s 中
for (int k=2;k<=n;k++)
{
if ((c[j][k]<lowcost[k])&&(!s[k])) //s 集合放进 j 后更新各结点

lowcost 的值
{
lowcost[k]=c[j][k];
closest[k]=j;
}
}
}
}。

相关主题