最小生成树算法[Prime/(Kruskal)]

来源:互联网 发布:阿里域名备案需要什么 编辑:程序博客网 时间:2024/05/19 10:36

构造联通网最小代价生成树称为最小生成树。

Prime算法。

由点到边~

输入二维n*n矩阵,代表相应两点之间权重大小。我们的目标是选出连通所有点的权重和最小的一条路。

思路:以第一个点为起点,选择它连接的所有点中权重最小的连接点,被选中的点成为第一次连通第一个点的点,之后更新adjvex[]数组,选中点相应下标对应数据设为0。之后以选中的点为下一次数据的参考行,更新保存相关顶点边的权重的数组lowcost[],再在该数组中选中权重最小值,保存位置,更新相应位置的adjvex数组,依次进行,付代码如下。

#include <iostream>using namespace std;void main(){int n;cout << "请输入部落个数n" << endl;cin >> n;cout << "请输入n行n列的距离矩阵" << endl;int a[10][10];for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){cin >> a[i][j];}}int min,j, k;int sum = 0;int adjvex[10];int lowcost[10];lowcost[0] = 0;adjvex[0] = 0;for (int i = 1; i < n; i++){lowcost[i] = a[0][i];adjvex[i] = 0;}for (int i = 1; i < n; i++){min = 65535;j = 1;k = 0;while (j < n){if (lowcost[j] != 0 && lowcost[j] < min){min = lowcost[j];k = j;}j++;}sum += min;lowcost[k] = 0;for (j = 1; j < n; j++){if (lowcost[j] != 0 && a[k][j] < lowcost[j]){lowcost[j] = a[k][j];adjvex[j] = k;}}}cout << sum << endl;}
以上输出为最小权重和。

0 0
原创粉丝点击