C++,Prim普里姆算法求最小生成树

思想:蓝白点。未加入生成树的点标记为蓝点,加入生成树的点标记为白点。

每次循环找到当前离白点集团最近的蓝点,加入最小生成树(标记为白点)。

更新每个蓝点到白点集团的最小值。

 

#include<iostream>
#include<cstring>
using namespace std;

int main(){
    int n,i,j;
    int e[101][101];
    int minn[101];
    bool u[101];
    int ans=0;
    
    memset(minn,0x7f,sizeof(minn));//将最小值设置为maxint
    minn[1]=0;//这样设置是为了第一次循环把1加入生成树 
    memset(u,1,sizeof(u));//将所有点设置为蓝点(标记为未加入最小生成树) 
    cin>>n;
    for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
    cin>>e[i][j];//构造邻接矩阵 
    
    int k;
    for(i=1;i<=n;i++){
        k=0;
        for(j=1;j<=n;j++)
        if(u[j]&&minn[j]<minn[k])
        {k=j;}//找出当前离白点集团最近的蓝点 
        
        u[k]=0;//将这个蓝点加入白点集团 
        for(j=1;j<=n;j++)
        if(u[j]&&e[k][j]<minn[j]){
            minn[j]=e[k][j];//更新每个蓝点到白点集团的最小值 
        }
    }
    
    for(i=1;i<=n;i++){
        ans+=minn[i];
    }
    cout<<ans;
    return 0;
} 
View Code

 

posted @ 2016-12-13 10:25  guesswhohia  阅读(4071)  评论(0编辑  收藏  举报