最小生成树之Prim算法(模板)

转载请注明出处:http://blog.csdn.net/u012860063


直接上代码:

// POJ  1258

#include <stdio.h>
#include <string.h>
#define INF 0x3f3f3f3f
#define MAXN 517
//创建m二维数组储存图表,low数组记录每2个点间最小权值,visited数组标记某点是否已访问
int m[MAXN][MAXN], low[MAXN], visited[MAXN];
int n;
int prim( )
{
    int i, j;
    int pos, minn, result=0;
    memset(visited,0,sizeof(visited));
    visited[1] = 1;
    pos = 1;          //从某点开始,分别标记和记录该点
    for(i = 1; i <= n; i++)     //第一次给low数组赋值
        if(i != pos)
            low[i] = m[pos][i];
        else
            low[i] = 0;
    for(i = 1; i < n; i++) //再运行n-1次
    {
        minn = INF;   //找出最小权值并记录位置
        for(j=1; j<=n; j++)
        {
            if(visited[j]==0 && minn>low[j])
            {
                minn = low[j];
                pos = j;
            }
        }
        result += minn;   //最小权值累加
        visited[pos] = 1;   //标记该点
        for(j = 1; j <= n; j++)   //更新权值
            if(visited[j]==0 && low[j]>m[pos][j])
                low[j] = m[pos][j];
    }
    return result;
}
int main()
{
    int i,j,ans;
    while(scanf("%d",&n)!=EOF)
    {
        memset(m,INF,sizeof(m));   //所有权值初始化为最大
        for(i = 1; i <= n; i++)
            for(j = 1; j <= n; j++)
            {
                scanf("%d",&m[i][j]);
            }
        ans=prim( );
        printf("%d\n",ans);
    }
    return 0;
}


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