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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM