普里姆算法 最小生成树


#include "stdio.h"
#include "stdlib.h"
#define MAXINT 32767
#define MAX 100
/*普里母算法 以节点为向导,找出节点相连最短的边*/
/*
test data: 6 0 1 1 0 2 33 0 3 43 0 4 5 0 5 32 1 2 3 1 3 4 1 4 5 1 5 76 2 3 2 2 4 5 2 5 6 3 4 5 3 5 665 4 5 4 -1 -1 -1
result:
please input node num:
(V0 ,V1)(V1 ,V2)(V2 ,V3)(V0 ,V4)(V4 ,V5)the sum is 15
*/
//输入顶点和边信息
void read(int a[][MAX],int *v)
{
int n,i,j,w;


printf("please input node num:\n");
scanf("%d",&n);
if(n>MAX)
{
printf("input node value not > %d",MAX);
return;
}
*v=n;
//初始化a
for(i=0;i<n;i++)
for(j=0;j<n;j++)a[i][j]=MAXINT;
do
{
scanf("%d%d%d",&i,&j,&w);
if(i==-1||j==-1||w==-1)break;
a[i][j]=w;
}while(9);
}
void plmMST(int a[][MAX],int n)
{
int c,i,j,min_w,min_i,min_j,sum=0;
//开始选中0节点 扫描
a[0][0]=-1;
for(c=0;c<n-1;c++)
{
min_w = MAXINT;
min_i = -1;
min_j = -1;

for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
//从节点扫描,找出同i点相关的节点(该节点未访问)最小的权
if(i!=j&&(a[i][i]==-1&&a[j][j]!=-1||a[i][i]!=-1&&a[j][j]==-1)&&a[i][j]<min_w)
{
min_w=a[i][j];
min_i=i;
min_j=j;
}
}
}
//找到最小权 ,置为访问
if(min_i!=-1)
{
printf("(V%-2d,V%d)",min_i,min_j);
//a[min_i][min_j]=MAXINT;?
a[min_i][min_i]=a[min_j][min_j]=-1;
sum+=min_w;
}
else
{
printf("图不是连通的\n");
exit(-2);
}
}
printf("the sum is %d\n",sum);

}
void main()
{
int a[MAX][MAX],vnum;
read(a,&vnum);
plmMST(a,vnum);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值