|
1鱼币
#define MAXVEX 100 //最大顶点数
#define INFINITY 0x7fffffff //最大值0x7fffffff表示为无穷大,表示不可通
typedef struct
{
int vexs[MAXVEX]; //顶点向量,顶点表
int arc[MAXVEX][MAXVEX]; //邻接矩阵
int numVertexes, numEdges; //图中当前的顶点数和边数
}MGraph;
//建立无向网图的邻接矩阵
void CreateMGraph(MGraph *G)
{
int i, j, k, w;
printf("请输入顶点数和边数:\n");
scanf_s("%d %d", &G->numVertexes, &G->numEdges);
printf("请输入顶点名称:\n");
for (i = 0; i < G->numVertexes; i++)
{
scanf_s("%d ", &G->vexs[i]);
}
for (i = 0; i < G->numVertexes; i++)
{
for (j = 0; j < G->numVertexes; j++)
{
G->arc[i][j] = INFINITY; //邻接矩阵初始化
}
}
for (k = 0; k < G->numEdges; k++)
{
printf("请输入边(vi,vj)上的下标i,下标j和对应的权w:\n");
scanf_s("%d %d %d", &i, &j, &w);
G->arc[i][j] = w;
G->arc[j][i] = G->arc[i][j];
}
}//CreateMGraph
// Prim算法生成最小生成树
void MiniSpanTree_Prim(MGraph G)
{
int min, i, j, k,sum = 0;
int adjvex[MAXVEX]; // 保存相关顶点下标
int lowcost[MAXVEX]; // 保存相关顶点间边的权值
lowcost[0] = 0; // V0作为最小生成树的根开始遍历,权值为0
adjvex[0] = 0; // V0第一个加入
// 初始化操作
for (i = 1; i < G.numVertexes; i++)
{
lowcost[i] = G.arc[0][i]; // 将邻接矩阵第0行所有权值先加入数组
adjvex[i] = 0; // 初始化全部先为V0的下标
}
// 真正构造最小生成树的过程
for (i = 1; i < G.numVertexes; i++)
{
min = INFINITY; // 初始化最小权值为0x7fffffff等不可能数值
k = 0;
// 遍历全部顶点
for (j = 1;j < G.numVertexes;j++)
{
// 找出lowcost数组已存储的最小权值
if (lowcost[j] != 0 && lowcost[j] < min)
{
min = lowcost[j]; //找出权值最小的路径长度
k = j; // 将发现的最小权值的下标存入k,以待使用。
}
}
// 打印当前顶点边中权值最小的边及其权值
printf("V%d - V%d = %d\n", adjvex[k], k,min);
sum += min; //求和
lowcost[k] = 0; // 将当前顶点的权值设置为0,表示此顶点已经完成任务,进行下一个顶点的遍历
// 邻接矩阵k行逐个遍历全部顶点
for (j = 1; j < G.numVertexes; j++)
{
if (lowcost[j] != 0 && G.arc[k][j] < lowcost[j]) //对这一点直达的顶点进行路径更新
{
lowcost[j] = G.arc[k][j];
adjvex[j] = k;
}
}
}
printf("最小权值之和 = %d\n",sum);
}//MiniSpanTree_Prim
int main()
{
MGraph T;
CreateMGraph(&T);
MiniSpanTree_Prim(T);
return 0;
} |
|