#include<stdio.h>
#include<string.h>
#define maxint 100
#define INF 0x3f3f3f3f
int c[10][10], n, m, minLength = 0;
void prim() {
int i, j, k;
int closestPoint[maxint];
int lowcost[maxint];
bool s[maxint];
s[1] = true;
for (i = 2; i <= n; i++) {//最初就加入了1点,先给其他点的lowcost和closestPoint初始化
lowcost[i] = c[1][i];
closestPoint[i] = 1;
s[i] = false;
}
for (i = 1; i < n; i++) {//有五个点,要循环查询5次数
int minn = INF;
j = 1;
for (k = 2; k <= n; k++) { //遍历S集合以外的点,找到离点S集合最近的点,相当于第二轮筛选
if ((lowcost[k] < minn) && (!s[k])) {//!s[k]表示点k还没被访问过
minn = lowcost[k];
j = k;
}
}
printf("%d --> %d\n", j, closestPoint[j]);//找到离j点最近的点i
minLength += lowcost[j];//累加每一步的距离,最后输出最小代价
s[j] = true;
//S集合中加入了新的点,V-S集合中的点的closestPoint和lowcost都有可能改变,因此要更新,相当于第一轮筛选
for (k = 2; k <= n; k++) {
if ((c[j][k] < lowcost[k]) && (!s[k])) {
lowcost[k] = c[j][k];
closestPoint[k] = j;
}
}
}
printf("最小生成树的路径长度为:%d", minLength);
}
int main() {
int i, j, u, v, w;
scanf("%d %d", &n, &m);//输入顶点个数,边的个数
for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) {
c[i][j] = INF;
}
}
for (i = 1; i <= m; i++) {
scanf("%d %d %d", &u, &v, &w);//输入顶点u和v,以及u,v之间的权值
c[u][v] = w;
c[v][u] = w;
}
/* 6 10
1 2 6
1 3 1
1 4 5
2 3 5
2 5 3
3 4 5
3 5 6
3 6 4
4 6 2
5 6 6 */
printf("最小生成树形成过程:\n");
prim();
return 0;
}
最小生成树——Prim算法
最新推荐文章于 2024-03-01 11:05:40 发布