poj 1258 Agri-Net 最小生成樹模板
阿新 • • 發佈:2019-02-16
#include <iostream> #include <stdio.h> #include <string.h> using namespace std; #define MAXV 501 #define INF 999999999 /* prim演算法:從第一個點出發,尋找最近的距離 每一次都尋找離這個堆最近距離的點,尋找到 最後一個點。 */ int n; int map[MAXV][MAXV]; int d[MAXV]; bool vis[MAXV]; void prim() { int i,j,v,tmp; for(i=0;i<n;i++)//第一個點距離所有點的距離 { vis[i]=0; d[i]=map[0][i]; } vis[0]=1; for(i=1;i<n;i++) { tmp=INF; for(j=0;j<n;j++)//找出距離最小的一個點出來 { if(!vis[j]&&tmp>d[j]) { tmp=d[j]; v=j; } } vis[v]=1; for(j=0;j<n;j++)//進行距離的調整,可能對加入的點距離更近 { if(!vis[j]&&d[j]>map[v][j]) { d[j]=map[v][j]; } }} for(d[0]=0,i=1;i<n;i++)d[0]+=d[i]; printf("%d\n",d[0]); } int main(){ int i,j,t; while(~scanf("%d",&n)) {for(i=0;i<n;i++) { for(j=0;j<n;j++) { scanf("%d",&map[i][j]); } } prim();} return 0; }