最小生成树prim算法C语言 实验报告,数据结构之---C语言实现最小生成树之prim(普里姆)算法...

A001952094-167945.png

//最小生成树之Prim算法

//杨鑫

#include

#include

#define n 6

#define MaxNum 10000 /*定义一个最大整数*/

/*定义邻接矩阵类型*/

typedef int adjmatrix[n + 1][n + 1]; /*0号单元没用*/

typedef struct

{

int fromvex, tovex; //生成树的起点和终点

int weight;//边的权重

}Edge;

typedef Edge *EdgeNode;//定义生成树的别名

int arcnum; /*边的个数*/

/*建立图的邻接矩阵*/

void CreatMatrix(adjmatrix GA)

{

int i, j, k, e;

printf("=============================\n");

printf("图中有%d个顶点\n", n);

for(i=1; i<=n; i++)

{

for(j=1; j<=n; j++)

{

if(i==j)

{

GA[i][j]=0; /*对角线的值置为0*/

}

else

{

GA[i][j]=MaxNum; /*其它位置的值置初始化为一个最大整数*/

}

}

}

printf("请输入边的个数:\n");

scanf("%d", &arcnum);

printf("请输入边的信息,按照起点,终点,权值的形式输入:\n");

for(k=1;k<=arcnum;k++)

{

scanf("%d,%d,%d",&i,&j,&e); /*读入边的信息*/

GA[i][j]=e;

GA[j][i]=e;

}

}

/*初始化图的边集数组*/

void InitEdge(EdgeNode GE,int m)

{

int i;

for(i=1;i<=m;i++)

{

GE[i].weight=0;

}

}

/*根据图的邻接矩阵生成图的边集数组*/

void GetEdgeSet(adjmatrix GA,EdgeNode GE)

{

int i, j, k = 1;

for(i=1;i<=n;i++)

{

for(j=i+1;j<=n;j++)

{

if(GA[i][j] !=0 && GA[i][j] != MaxNum)

{

GE[k].fromvex = i;

GE[k].tovex = j;

GE[k].weight = GA[i][j];

k++;

}

}

}

}

/*按升序排列图的边集数组*/

void SortEdge(EdgeNode GE,int m)

{

int i,j,k;

Edge temp;

for(i=1;i

{

k=i;

for(j=i+1;j<=m;j++)

{

if(GE[k].weight > GE[j].weight)

{

k=j;

}

}

if(k!=i)

{

temp = GE[i];

GE[i]=GE[k];

GE[k]=temp;

}

}

}

/*利用普里姆算法从初始点v出发求邻接矩阵表示的图的最小生成树*/

void Prim(adjmatrix GA,EdgeNode T)

{

int i,j,k,min,u,m,w;

Edge temp;

/*给T赋初值,对应为v1依次到其余各顶点的边*/

k=1;

for(i=1;i<=n;i++)

{

if(i!=1)

{

T[k].fromvex=1;

T[k].tovex=i;

T[k].weight=GA[1][i];

k++;

}

}

/*进行n-1次循环,每次求出最小生成树中的第k条边*/

for(k=1;k

{

min=MaxNum;

m=k;

for(j=k;j

{

if(T[j].weight

{

min=T[j].weight;m=j;

}

}

/*把最短边对调到k-1下标位置*/

temp=T[k];

T[k]=T[m];

T[m]=temp;

/*把新加入最小生成树T中的顶点序号赋给j*/

j=T[k].tovex;

/*修改有关边,使T中到T外的每一个顶点保持一条到目前为止最短的边*/

for(i=k+1;i

{

u=T[i].tovex;

w=GA[j][u];

if(w

{

T[i].weight=w;T[i].fromvex=j;

}

}

}

}

/*输出边集数组的每条边*/

void OutEdge(EdgeNode GE,int e)

{

int i;

printf("按照起点,终点,权值的形式输出的最小生成树为:\n");

for(i=1;i<=e;i++)

{

printf("%d,%d,%d\n",GE[i].fromvex,GE[i].tovex,GE[i].weight);

}

printf("=============================\n");

}

int main()

{

adjmatrix GA;

Edge GE[n*(n-1)/2], T[n];

CreatMatrix(GA);

InitEdge(GE,arcnum);

GetEdgeSet(GA,GE);

SortEdge(GE,arcnum);

Prim(GA,T);

printf("\n");

OutEdge(T,n-1);

return 0;

}

结果:

A001954312-167945.png_small.png

版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值