prim算法

prim算法是构造最小生成树的一种算法= =个人觉得写起来没有克鲁斯卡尔那么优美

首先我们用个二维数组G[N][N]来保存权值,用low[N]数组来保存最小权值,vis[N]来保存是否已经添加到MTS中

然后结合poj1258实现prim算法

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
const int inf=2500000;
int G[555][555]; 
int x[555],y[555];
int low[555]; 
int vis[555];
int n; 
void prim()
{
    memset(vis,0,sizeof(vis));
    int pos=1;//先选定一个点,然后由这个点出发逐步构造MTS 
    int min;
    long long ans=0;
    vis[1]=1;
    for(int i=1;i<=n;i++)//给low数组初次赋值 
    low[i]=G[pos][i];
    for(int i=1;i<n;i++)//还有n-1个点要归纳进去 
    {
        min=inf;
        for(int j=1;j<=n;j++)
        {
            if(!vis[j]&&low[j]<min)//寻找最小的权值 
            {
                min=low[j];
                pos=j;
            }
        }
        vis[pos]=1;
        ans+=min;
        for(int j=1;j<=n;j++)//由新选定的点出发,更新最小权值 
        {
            if(!vis[j]&&low[j]>G[pos][j])
            low[j]=G[pos][j];
        }
    } 
    printf("%I64d\n",ans);
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                scanf("%d",&G[i][j]);
            }
        }
        prim();
    }
    return 0;
} 
   

 

你可能感兴趣的:(prim算法)