//这题很简单
//最小生成树用prim
//就是求生成树边长之和
#include <iostream>
#include <cstring>
#define MAXN 101
#define INF 100001
using namespace std;
int N;
int Edge[MAXN][MAXN];
int lowcost[MAXN];
int sumlen;
void prim()
{
lowcost[0] = -1;
int v;
for(int i = 1; i < N; i++)
{
lowcost[i] = Edge[0][i];
}
for(int i = 1; i < N; i++)
{
int min = INF;
for(int k = 1; k < N; k++)
{
if(lowcost[k] != -1 && lowcost[k] < min)
{
v = k;
min = lowcost[k];
}
}
sumlen += min;
lowcost[v] = -1;
for(int k = 0; k < N; k++)
{
if(lowcost[k] > Edge[v][k])
{
lowcost[k] = Edge[v][k];
}
}
}
}
int main()
{
while(cin>>N)
{
if(N == 0)
break;
for(int i = 0; i < N; i++)
{
for(int j = 0; j < N; j++)
{
cin>>Edge[i][j];
}
}
memset(lowcost,0,sizeof(lowcost));
sumlen = 0;
prim();
cout<<sumlen<<endl;
}
return 0;
}
poj 1258 prim
最新推荐文章于 2017-08-21 00:11:33 发布