用c语言写出下列代码,读入一个无向图的邻接矩阵(即数组表示),建立无向图并按PRIM算法建立最小生成树,并输出最小生成树的代价。 输入的第一行包含一个正整数n,表示图中共有n个顶点。其中n不超过50。 以后的n行中每行有n个用空格隔开的整数,对于第i行的第j个整数,如果不为0,则表示第i个顶点和第j个顶点有直接连接且代价为相应的值,0表示没有直接连接。当i和j相等的时候,保证对应的整数为0。 输入保证邻接矩阵为对称矩阵,即输入的图一定是无向图,且保证图中只有一个连通分量。 输出只有一个整数,即最小生成树的总代价。请注意行尾输出换行。
时间: 2024-02-21 16:59:31 浏览: 160
```
#include <stdio.h>
#include <stdlib.h>
#define INF 0x3f3f3f3f
int main()
{
int n, i, j, min, u, v, sum = 0;
int lowcost[51], adjmatrix[51][51];
scanf("%d", &n);
for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) {
scanf("%d", &adjmatrix[i][j]);
if (adjmatrix[i][j] == 0) {
adjmatrix[i][j] = INF;
}
}
}
for (i = 2; i <= n; i++) {
lowcost[i] = adjmatrix[1][i];
}
for (i = 2; i <= n; i++) {
min = INF;
for (j = 2; j <= n; j++) {
if (lowcost[j] != 0 && lowcost[j] < min) {
min = lowcost[j];
u = j;
}
}
sum += min;
lowcost[u] = 0;
for (v = 2; v <= n; v++) {
if (lowcost[v] != 0 && adjmatrix[u][v] < lowcost[v]) {
lowcost[v] = adjmatrix[u][v];
}
}
}
printf("%d\n", sum);
return 0;
}
```
解释:该代码使用 Prim 算法实现了无向图的最小生成树的建立,其基本思路是:先将与第一个顶点相连的所有边的权值存入 lowcost 数组中,然后循环 n-1 次,在 lowcost 中查找最小权值的边,将其加入生成树中,并更新 lowcost 数组。在更新 lowcost 时,若新的权值小于原来的值,则用新的值更新。
阅读全文