贪心算法实验(最小生成树)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法分析与设计实验报告第一次附加实验
附录:
完整代码(贪心法)
//贪心算法最小生成树prim算法
#include
#include
#include
#include
#include
using namespace std;
#define inf 9999; //定义无限大的值const int N=6;
template
void Prim(int n,Type c[][N+1]);
int main()
{
int c[N+1][N+1];
cout<<"连通带权图的矩阵为:"< for(int i=1;i<=N;i++) //输入邻接矩阵{ for(int j=1;j<=N;j++) { cin>>c[i][j]; } } cout<<"Prim算法最小生成树选边次序如下:"< 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< system("pause"); return 0; } template //参数为结点个数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 { Type min=inf; int j=1; for(int k=2;k<=n;k++)//找出V-S中是lowcost最小的顶点j { if((lowcost[k] { min=lowcost[k]; //更新min的值 j=k; } } cout< s[j]=true; //将j添加到s中 for(int k=2;k<=n;k++) { if((c[j][k] { lowcost[k]=c[j][k]; closest[k]=j; } } } }