#include <iostream>
#include <algorithm>
using namespace std;
const int M =110;
long g[M][M]; // g[i][j] i->j 花费
long long d[M];// d[i] 点i到生成树距离
int main()
{
int n;
while(cin>>n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>g[i][j];
}
}
d[0]=0; // 任选一点作为树根
for(int i=1;i<n;i++)
{
if(g[0][i])
{
d[i]=g[0][i];
}
}
int ans=0;
while(1)
{
int u=-1;// 当前没加入生成树&&距离生成树最近的点
for(int i=1;i<n;i++)
{
if(d[i]&&(u==-1||d[i]<d[u]))
u=i;
}
if(u==-1) break;
ans+=d[u];
d[u]=0; //顶点u入生成树
for(int i=0;i<n;i++)//顶点u入生成树后 更新d[i]
{
if(d[i]>d[u]+g[u][i])
{
d[i]=d[u]+g[u][i];
}
}
}
cout<<ans<<endl;
}
return 0;
}
poj 1258 最小生成树Prim
最新推荐文章于 2019-08-14 06:47:59 发布