最小生成树 prim算法


/*
#include <iostream>
using namespace std;

void prim()
{
    const int INF = 65536;//表示无穷大
    const int N = 100;//N为图中所有的节点数
    bool visited[N+1] = {false};//数组visited保存节点是否有被访问过,初始化为false
    int low[N+1];//保存已访问节点离未访问节点的最短距离
    int dist[N+1][N+1];//距离矩阵,用来保存图中节点之间的距离
    int result = 0;//最短距离
    int edge[N+1];//用来保存选择的点的依附节点
    int min = INF;
    int v;
    //初始化矩阵/
    for (int i=1; i<=N; ++i)
    {
        for (int j=1; j<=N; ++j)
        {
            if (i == j)
            {
                dist[i][j] = 0;
            }
            else
                dist[i][j] = INF;
        }
    }
    //输入边的信息//
    int m, a, b, c, n;
    cout << "输入总的顶点数,边数:";
    cin >> n >> m;
    cout << "输入边的两个节点和边的长短:" << endl;
    for (int i=1; i<=m; ++i)
    {
        cin >> a >> b >> c;
        dist[a][b] = dist[b][a] = c;
    }

   //

    visited[1] = true;//我们选取第一个节点为初始节点
    low[1] = 0;
    edge[1] = 1;
    //初始化low和edge
    for (int i=2; i<=n; ++i)
    {
        low[i] = dist[1][i];
        edge[i] = 1;//初始化所有的节点依附节点为节点1
    }

    //循环N-1次,来求得最小生成树所花费的最短路径,因为有N个点,所以树有N-1个边
    for (int i=1; i<n; ++i)
    {
        min = INF;
        for (int j=1; j<=n; ++j)
        {
            if (!visited[j] && low[j]<min)//如果节点j没有被访问过并且当前路径小于min
            {
                min = low[j];
                v = j;
            }
        }
        //找到未被访问的节点V路径最短
        result += min;
        visited[v] = true;
        cout << "(" << v << "," << edge[v] << ")" << endl;//输出找到的这个点所依附的节点,相当于输出一条边
        //更新数组low和edge
        for (int i=1; i<=n; ++i)
        {
            if (!visited[i] && low[i]>dist[v][i])//如果节点i没有被访问过并且当前路径小于已知的路径low
            {
                low[i] = dist[v][i];
                edge[i] = v;//将节点i的新依附节点设置为找到的节点v
            }
        }

    }
    cout << result << endl;
    return ;//完毕后,得到的result即为最小生成树最短路径长度,数组edge即为选择的节点边的信息

}

int main()
{
    prim();
    return 0;
}
输入总的顶点数,边数:7 9
输入边的两个节点和边的长短:
1 2 28
1 6 10
2 3 16
2 7 14
3 4 12
4 5 22
4 7 18
5 6 25
5 7 24
(6,1)
(5,6)
(4,5)
(3,4)
(2,3)
(7,2)
99

Process returned 0 (0x0)   execution time : 22.609 s
Press any key to continue.
*/

















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值