zoukankan      html  css  js  c++  java
  • 最小生成树Prim算法理解

    最小生成树Prim算法理解

    标签(空格分隔): 最小生成树 图论 Prim


    MST(Minimum Spanning Tree,最小生成树)问题有两种通用的解法,Prim算法就是其中之一,它是从点的方面考虑构建一颗MST,大致思想是:设图G顶点集合为U,首先任意选择图G中的一点作为起始点a,将该点加入集合V,再从集合U-V中找到另一点b使得点b到V中任意一点的权值最小,此时将b点也加入集合V;以此类推,现在的集合V={a,b},再从集合U-V中找到另一点c使得点c到V中任意一点的权值最小,此时将c点加入集合V,直至所有顶点全部被加入V,此时就构建出了一颗MST。因为有N个顶点,所以该MST就有N-1条边,每一次向集合V中加入一个点,就意味着找到一条MST的边。


    初始状态:
    此处输入图片的描述

    设置2个数据结构:
    lowcost[i]:表示以i为终点的边的最小权值,当lowcost[i]=0说明以i为终点的边的最小权值=0,也就是表示i点加入了MST
    mst[i]:表示对应lowcost[i]的起点,即说明边

    #include<iostream>  
    #include<fstream>  
    using  namespace std;  
    
    #define MAX 100  
    #define MAXCOST 0x7fffffff  
    
    int graph[MAX][MAX];  
    
    int prim(int graph[][MAX], int n)  
    {  
        int lowcost[MAX];  
        int mst[MAX];  
        int i, j, min, minid, sum = 0;  
        for (i = 2; i <= n; i++)  
        {  
            lowcost[i] = graph[1][i];  
            mst[i] = 1;  
        }  
        mst[1] = 0;  
        for (i = 2; i <= n; i++)  
        {  
            min = MAXCOST;  
            minid = 0;  
            for (j = 2; j <= n; j++)  
            {  
                if (lowcost[j] < min && lowcost[j] != 0)  
                {  
                    min = lowcost[j];  
                    minid = j;  
                }  
            }  
            cout << "V" << mst[minid] << "-V" << minid << "=" << min << endl;  
            sum += min;  
            lowcost[minid] = 0;  
            for (j = 2; j <= n; j++)  
            {  
                if (graph[minid][j] < lowcost[j])  
                {  
                    lowcost[j] = graph[minid][j];  
                    mst[j] = minid;  
                }  
            }  
        }  
        return sum;  
    }  
    
    int main()  
    {  
        int i, j, k, m, n;  
        int x, y, cost;  
        ifstream in("input.txt");  
        in >> m >> n;//m=顶点的个数,n=边的个数  
        //初始化图G  
        for (i = 1; i <= m; i++)  
        {  
            for (j = 1; j <= m; j++)  
            {  
                graph[i][j] = MAXCOST;  
            }  
        }  
        //构建图G  
        for (k = 1; k <= n; k++)  
        {  
            in >> i >> j >> cost;  
            graph[i][j] = cost;  
            graph[j][i] = cost;  
        }  
        //求解最小生成树  
        cost = prim(graph, m);  
        //输出最小权值和  
        cout << "最小权值和=" << cost << endl;  
        system("pause");  
        return 0;  
    }  

    Input:

    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  

    Output:

    V1-V3=1  
    V3-V6=4  
    V6-V4=2  
    V3-V2=5  
    V2-V5=3  
    最小权值和=15  
    请按任意键继续. . .  
    Fighting~
  • 相关阅读:
    Shiro结合配置文件实战实现权限验证
    Shiro的一些概念解释以及配置了解
    jedis工具类
    【转载】redis的主从复制
    Redis的事务
    redis的持久化
    SSM框架-SpringMVC 实例文件上传下载
    如何设置CentOS 7获取动态及静态IP地址
    阿里云linux centos 一键部署web环境--图文详解
    SVN使用教程总结
  • 原文地址:https://www.cnblogs.com/Archger/p/12774781.html
Copyright © 2011-2022 走看看