这个问题需要找出所给图的最小生成树。我们使用prim算法:
在每一步,将不在树中的长度最小的边加入树中。
由于树的尺寸足够小,我们不需要任何复杂的算法:我们每次都把每个节点考虑一遍。
/*
ID:xsy97051
LANG:C++
TASK:agrinet
*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n,map[101][101],d[101],ans=0;//map数组储存图表,d数组记录每2个点间最小权值,use数组标记某点是否已访问
bool use[101];
#define INF 1000000000
int main()
{
freopen("agrinet.in","r",stdin);
freopen("agrinet.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>map[i][j];
for(int i=2;i<=n;i++)
d[i]=INF;
memset(use,0,sizeof(use));
d[1]=0;//从某点开始,分别标记和记录该点
for(int i=1;i<n;i++)
{
int min=2*INF,x;
for(int j=1;j<=n;j++)//找出最小权值并记录位置
if((!use[j]) && (d[j]<min))
{
min=d[j];
x=j;
}
ans+=min;//最小权值累加
use[x]=1;//标记该点
for(int j=1;j<=n;j++)//更新权值
if((!use[j]) && (map[x][j]<d[j]))
d[j]=map[x][j];
}
cout<<ans<<endl;
return 0;
}