33,010
社区成员
发帖
与我相关
我的任务
分享
//普里姆算法,用来找出图中最小生成树
#include <stdio.h>
#define MAXVEX 9
#define INFINITY 65535
typedef char VertexType; //顶点类型
typedef int EdgeType; //权值
typedef struct{
VertexType vexs[MAXVEX]; //定点表
EdgeType arc[MAXVEX][MAXVEX]; //边矩阵,存放权值
int numVertexes,numEdges; //顶点数,权值数
}MGraph;
//首先构造邻阶矩阵
int createMGraph(MGraph *G){
int i,j;
printf("请输入顶点数和边数\n");
scanf("%d,%d",&G->numVertexes,&G->numEdges);
printf("请输入顶点的值\n");
for(i=0;i<G->numVertexes;i++){
scanf(&G->vexs[i]);
}
//边矩阵初始化
for(i=0;i<G->numVertexes;i++){
for(j=0;j<G->numVertexes;j++){
G->arc[i][j]=INFINITY; //邻接矩阵初始化
}
}
//用户输入权值
for(i=0;i<G->numVertexes;i++){
for(j=0;j<G->numVertexes;j++){
printf("输入边(%d,%d)上的权值\n",i,j);
scanf("%d",&G->arc[i][j]);
G->arc[j][i] = G->arc[i][j]; //因为是无向图,所以为对称矩阵
}
}
return 0;
}
//获取临时权值数组中的最小值
int getMin(int lowcost[],MGraph *G){
int min,minSign,i;
min = INFINITY; //初始化min为正无穷,这里表示整形的最大值65536
for(i=0;i<G->numVertexes;i++){ //由于数组的长度是100,这里实际矩阵的长度没有这么长,所以要用实现设定的numVertexes
//循环变量矩阵第一行的全部权值
if(lowcost[i] != 0 && lowcost[i] < min){
min = lowcost[i];
minSign = i;
}
}
return minSign;
}
//prim算法实现最小生成树
void Prim_MinSanTree(MGraph *G){
int i,minSign,j; //为某一个顶点,在矩阵中代表某行
int node[MAXVEX]; //保存定点下标
int lowcost[MAXVEX]; //保存权值
//初始化操作
for(i=1;i<G->numVertexes;i++){ //初始化node数组和把矩阵第一行存入到lowcost
lowcost[i] = G->arc[0][i];
node[i] = 0;
}
for(i = 1; i < G->numVertexes;i++){
//找出数组中的最小值的下标
minSign = getMin(lowcost,G);
//打印当前顶点边权值最小的边
printf("(%d,%d)",node[minSign],minSign);
lowcost[minSign] = 0; //将当前权值设置为0,下次不予判断
for(j=1;j<G->numVertexes;j++){
if(lowcost[j] != 0 && G->arc[minSign][j] < lowcost[j]){
lowcost[j] = G->arc[minSign][j];
node[j] = minSign;
}
}
}
}
int main(){
MGraph *G = NULL;
printf("---------------------------程序开始运行----------------------------\n");
printf("---------------------------开始构造矩阵----------------------------\n");
createMGraph(G);
return 0;
}