1. 程式人生 > >最小生成樹之Prim演算法(模板)

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

直接上程式碼:

// 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;
}