该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
//最小生成树的Prim算法实现,时间复杂度为O(n^2)
#include
struct enode
{
int weight;
int u,v;
};
int main()
{
int s[20],n,a[20][20],min,lowcost[20],closest[20],sum;
int i,j,k,kk=0;
enode t[20];
printf("输入图的顶点数:");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
for(j=i+1;j<=n;j++)
{
printf("输入边(%d,%d)的权值,若不存在输入10000:",i,j);
scanf("%d",&a[i][j]);
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=i;j++)
a[i][j]=a[j][i];
}
s[1]=1;
for(i=2;i<=n;i++)
{
lowcost[i]=a[i][1];
closest[i]=1;
s[i]=0;
}
for(i=1;i
{
min=10000;j=1;
for(k=2;k<=n;k++)
if((lowcost[k]
{min=lowcost[k];j=k;}
if(min==10000) goto end;
t[kk].weight=lowcost[j]; t[kk].u=j;
t[kk++].v=closest[j];s[j]=1;
for(k=2;k<=n;k++)
{
if((a[k][j]
{
lowcost[k]=a[k][j];
closest[k]=j;
}
}
}
end:
if(kk!=n-1) printf("无法生成最小生成树!\n");
else
{
sum=0;
for(k=0;k
sum+=t[k].weight;
printf("最小生成树上的边为:\n");
for(k=0;k
printf("(%d,%d)",t[k].u,t[k].v);
printf("\n最小生成树的总长为%d\n",sum);
}
return 0;
}