• Prim算法


    Prim算法,代码核心在于一个双重循环,所以算法时间复杂度为O(n*n)。

    该算法与图中的边数无关。

    适用于计算边稠密的最小生成树。

    Prim算法采用贪心,不同于Kruskal算法的地方是,Prim算法筛选节点,找到下一条权最小的路。而Kruskal算法筛选权,来连接节点。

    ///     Prim
    
    bool Prim(int n) {
        memset(vis,0,sizeof(vis));      ///初始化每条路没走过
    
        
        ///初始化到每个点的权为inf,第一次更新dis时,才会将邻接矩阵存入dis
        for(int i=1; i<=n; i++) {
            dis[i]=inf;
        }
    
        ans=0;
        dis[1]=0;
    
        ///处理每个点,加入到集合中去
        for(int i=1; i<=n; i++) {
            int tmp=inf,k=0;
    
            for(int j=1; j<=n; j++) {       ///找每个点,找到最小的权
                if(!vis[j]&&dis[j]<tmp) {
                    tmp=dis[j];
                    k=j;                    ///找到节点
                }
            }
    
            if(tmp==inf) return false;
    
            vis[k]=true;
            ans+=tmp;
            
            ///更新最小权
            for(int j=1; j<=n; j++) {
                if(!vis[j]&&dis[j]>a[k][j]) {
                    dis[j]=a[k][j];
                }
            }
        }
        
        return true;
    }
    View Code
  • 相关阅读:
    BZOJ1006: [HNOI2008]神奇的国度
    弦图与区间图
    后缀自动机
    插头DP
    BZOJ3328: PYXFIB
    BZOJ2118: 墨墨的等式
    BZOJ3916: [Baltic2014]friends
    BZOJ1337: 最小圆覆盖
    BZOJ3784: 树上的路径
    代码模版
  • 原文地址:https://www.cnblogs.com/TreeDream/p/5384523.html
Copyright © 2020-2023  润新知