题目大意:给定邻接矩阵求最小生成树的权值和。
Sample Input
4
0 4 9 21
4 0 8 17
9 8 0 16
21 17 16 0
Sample Output
28
AC Code:PrimMemory:208K Time:16MS
#include <iostream>
#include <cstdio>
#include <cstring>
#define MaxV 105
#define Inf 0x7ffffff
using namespace std;
int n;
int map[MaxV][MaxV];
int value;
void prim()
{ int i; int s,num,min,k; int dist[MaxV]; bool p[MaxV];
value=0; memset(p,0,sizeof(p));
for(i=1;i<=n;i++) dist[i]=Inf;
s=1,k=0;
while(1)
{ k++; p[s]=1;
if(k==n) break;
min=Inf;
for(i=2;i<=n;i++)
{ if(p[i]) continue;
if(dist[i]>map[s][i]) dist[i]=map[s][i];
if(dist[i]<min) { min=dist[i]; num=i; }
}
s=num; value+=min;
}
}
void init()
{int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&map[i][j]);
}
int main()
{ //freopen("in.txt","r",stdin);
while(scanf("%d",&n)!=EOF)
{ init();
prim();
printf("%d\n",value);
}
return 0;
}