//目录

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

 

posted @ 2016-04-12 21:18  小草的大树梦  阅读(737)  评论(0编辑  收藏  举报