最小生成樹之Prim演算法(模板)
阿新 • • 發佈:2019-02-15
直接上程式碼:
// 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; }