code1078 最小生成树(Prim算法/普里姆算法)

最小生成树有两种算法,Prim算法和Kruskal算法。

Prim算法

^1是从任意选取的一个点出发,将该点放到数组vex中,然后将这个点到其他点(1到n)的距离存放到数组tem中,再选取距离最短(权值最小)的边,并将该边所连接到的点放入vex中。

^2把该点到其他点(除了vex中的点以外的&&1 到n的n个点)的距离与tem中存储的到每个点的距离相比,更新到每个点的最短距离,然后再选取距离最短(权值最小)的边,并将该边所连接到的点放入vex中

重复以上步骤^,直到vex中存储了n个点(找到了n-1条边)为止。

#include <iostream>
using namespace std;
int main()
{
    int n;
    int minn=999999,sum=0;
    int shu[103][103];
    int vex[103]={0};//直接数组赋值int vex[103]={1};并不会成功,数组整体赋值只能赋值为0,所以后面用!vex[j]的形式
    int tem[103];
    for(int g=0;g<103;g++){
        tem[g]=9999999;//直接数组赋值int tem[103]={999999};并不会成功,数组整体赋值只能赋值为0。
    }
    cin>>n;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            cin>>shu[i][j];
        }
    }
    int k=0;
    for(int i=1;i<n;i++){
        for(int j=1;j<n;j++){
            if(!vex[j]&&shu[k][j]<tem[j])
                tem[j]=shu[k][j];
        }
        for(int l=1;l<n;l++){
            if(!vex[l]&&tem[l]<minn)
            {
                 minn=tem[l];k=l;
            }
        }
        vex[k]=1;
        sum+=minn;
        minn=999999;//及时重新赋值,或者将int minn放到往上第二个for里面第一句
    }
    cout<<sum<<endl;
}


你可能感兴趣的:(算法,最小生成树,ACM,Prim)