实验 1 贪心算法实现最小生成树
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一用贪心算法实现最小生成树问题
一.实验目的
1.熟悉贪心算法的基本原理和使用范围。
二.实验内容及要求
内容:任选一种贪心算法(prim或Kruskal),求解最小生成树。对算法进行编程。
要求:使用贪心算法编程,求解最小生成树问题
三.程序列表
(1)prim算法
#include
#define INF 32766
#define max 40
void prim(int g[][max],int n)
{
int lowcost[max],closest[max];
int i,j,k,min;
for(i=2;i<=n;i++)
{
lowcost[i]=g[1][i];
closest[i]=1;
}
lowcost[1]=0;
for(i=2;i<=n;i++)
{
min=INF;
k=0;
for(j=2;j<=n;j++)
{
if((lowcost[j] { min=lowcost[j]; k=j; } } printf("(%d,%d)%d\t",closest[k],k,min); lowcost[k]=0; for(j=2;j<=n;j++) { if(g[k][j] { lowcost[j]=g[k][j]; closest[j]=k; } } printf("\n"); } } int adj(int g[][max]) { int n,i,j,v1,v2,weight,m; printf("输入顶点数 n=:"); scanf("%d",&n); for(i=1;i<=n;i++) for(j=1;j<=n;j++) g[i][j]=INF; while(v1!=0&&v2!=0&&weight!=0)//只要输入0 0 0就结束{ printf("v1,v2,weight="); scanf("%d %d %d",&v1,&v2,&weight); g[v1][v2]=weight; g[v2][v1]=weight; } return(n); } void prg(int g[][max],int n) { int i,j; for(i=0;i<=n;i++) printf("%d\t",i); for(i=1;i<=n;i++) { printf("\n%d\t",i); for(j=1;j<=n;j++) printf((g[i][j]==INF)?"\t":"%d\t",g[i][j]); } printf("\n"); } void main() { int g[max][max],n,i; n=adj(g); printf("输出无向图的邻接矩阵:\n"); prg(g,n); printf("输出最小生成树:\n"); prim(g,n); } 四.实验结果