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 ",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; }