Prim算法的实现

来源:互联网 发布:wrap相类似的软件 编辑:程序博客网 时间:2024/05/01 23:12

好吧,这是我写的Prim算法,直接上代码:

/*测试数据6 101 2 61 3 11 4 52 3 53 4 52 5 3 3 5 63 6 44 6 25 6 6*/#include <stdio.h>#include <stdlib.h>#include <string.h>#define N 100  //定义最大顶点数Nconst int MaxInt = 99999999;int map[N][N], low[N], visited[N], n;  //map数组存储图的邻接矩阵形式的权值                            //low数组记录每2个结点间最小权值,visited数组标记是否已被访问int prim(){int i, j, pos, min;   // pos为位置int result = 0;memset(visited, 0, sizeof(visited));visited[1] = 1, pos = 1;  // 从某点开始, 分别标记和记录该点for (i = 1; i <= n; i++)// 第一次给low数组赋值if(i != pos)low[i] = map[pos][i];printf("路径为:%d->", pos);for (i = 1; i < n; i++)// 再运行n-1次(给low数组赋值的操作){// 找出最小权值并记录位置min = MaxInt;  for (j = 1; j <= n; j++)if(visited[j] == 0 && min > low[j]){min = low[j];pos = j;}printf("%d->", pos);result += min;// 最小权值累加visited[pos] = 1; // 标记该点//更新权值for (j = 1; j <= n; j++)if(visited[j] == 0 && low[j] > map[pos][j])low[j] = map[pos][j];}return result;}int main(){int i, j, m, s, e, w;while(scanf("%d %d", &n, &m) != EOF){// 所有权值初始化为最大for(i = 1; i <= n; i++)for(j = 1; j <= n; j++)map[i][j] = MaxInt;for (i = 0; i < m; i++){scanf("%d %d %d", &s, &e, &w);map[s][e] = map[e][s] = w;}printf("\n总权值 = %d\n", prim());}return 0;}


原创粉丝点击