数据结构与算法 ~ 图 ~ 最小生成树 ~ 普里姆算法(图采用邻接矩阵方式存储)
数据结构与算法 ~ 图 ~ 最小生成树 ~ 普里姆算法(图采用邻接矩阵方式存储)/*graph--prim*/#include<stdlib.h>#include<stdio.h>#define MAX 10struct vexnode{int visited;/*顶点访问标志*/}vex[MAX];int array[MAX][MAX];/*存放权值...
·
数据结构与算法 ~ 图 ~ 最小生成树 ~ 普里姆算法(图采用邻接矩阵方式存储)
/*graph--prim*/
#include<stdlib.h>
#include<stdio.h>
#define MAX 10
struct vexnode{
int visited;/*顶点访问标志*/
}vex[MAX];
int array[MAX][MAX];/*存放权值*/
int vexnum=-1;
/*创建图的邻接矩阵*/
void create(){
int source,destination,weight,max;
int i,j;
for(i=0;i<MAX;i++)
for(j=0;j<MAX;j++) array[i][j]=0;
printf("\n===create Graph===\n");
printf("\n请输入弧的信息:起点 终点 权值(exit for -1):");
scanf("%d%d%d",&source,&destination,&weight);
while (source!=-1){
array[source][destination]=weight;
array[destination][source]=weight;
max=(source>destination)?source:destination;
if (max>vexnum)
vexnum=max;
printf("\n请输入弧的信息:起点 终点 权值(exit for -1):");
scanf("%d%d%d",&source,&destination,&weight);
}/*while*/
printf("\n===create over===\n");
}/*create*/
void Print(){
int i,j,k;
printf("\n===当前图====");
printf ("\n array :");
for(i=0;i<=vexnum;i++) printf("%8d",i);
printf("\n");
for(i=0;i<=vexnum;i++){
printf("%10d:",i);
for(j=0;j<=vexnum;j++)
printf("%8d",array[i][j]);
printf("\n");
}
printf("\n===图的输出结束====");
}
void prim(){
int i,j;
int edgenum=0,sum=0;
int tempi,tempj,min=999;
for(i=0;i<=vexnum;i++)
vex[i].visited=0;/*设置所有顶点均未被访问*/
printf("\n===普里姆算法:");
for(i=0;i<=vexnum;i++)/*查找图中的第一条最小边*/
for(j=0;j<=vexnum;j++)
if (array[i][j]!=0&&array[i][j]<min){
min=array[i][j];
tempi=i;tempj=j;
}
printf("[%d,%d](%d)==>",tempi,tempj,array[tempi][tempj]);
sum+=array[tempi][tempj];
vex[tempi].visited=1;
vex[tempj].visited=1;
edgenum++;
while(edgenum<vexnum-1){
min=999;
/*查找下一条的最小边*/
for(i=0;i<=vexnum;i++) {
if (vex[i].visited==0)
continue;/*此边应从已访问的结点出发*/
for(j=0;j<=vexnum;j++)
if (array[i][j]==0||vex[j].visited==1)
continue;/*连接到未访问的顶点*/
else if (array[i][j]<min){
min=array[i][j];
tempi=i;tempj=j;
}/*if*/
}/*for*/
printf("[%d,%d](%d)==>",tempi,tempj,array[tempi][tempj]);
sum+=array[tempi][tempj];
vex[tempj].visited=1;/*标志为已访问*/
vex[tempj].visited=1;
edgenum++;
}/*while*/
printf("普里姆结束\n");
printf("权值之和是%d",sum);
}/*prim*/
main(){
create();
Print();
prim();
system("pause");
exit(0);
}/*main*/
运行结果是:
===create Graph===
请输入弧的信息:起点 终点 权值(exit for -1):1 2 6
请输入弧的信息:起点 终点 权值(exit for -1):1 3 1
请输入弧的信息:起点 终点 权值(exit for -1):1 4 5
请输入弧的信息:起点 终点 权值(exit for -1):2 3 5
请输入弧的信息:起点 终点 权值(exit for -1):3 4 5
请输入弧的信息:起点 终点 权值(exit for -1):2 5 3
请输入弧的信息:起点 终点 权值(exit for -1):3 5 6
请输入弧的信息:起点 终点 权值(exit for -1):3 6 4
请输入弧的信息:起点 终点 权值(exit for -1):4 6 2
请输入弧的信息:起点 终点 权值(exit for -1):5 6 6
请输入弧的信息:起点 终点 权值(exit for -1):-1 -1 -1
===create over===
===当前图====
array : 0 1 2 3 4 5 6
0: 0 0 0 0 0 0 0
1: 0 0 6 1 5 0 0
2: 0 6 0 5 0 3 0
3: 0 1 5 0 5 6 4
4: 0 5 0 5 0 0 2
5: 0 0 3 6 0 0 6
6: 0 0 0 4 2 6 0
===图的输出结束====
===普里姆算法:[1,3](1)==>[3,6](4)==>[6,4](2)==>[3,2](5)==>[2,5](3)==>普里姆结束
权值之和是15
请按任意键继续. . .

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)