题解
本人过于懒惰,直接去看官方题解吧
新的分支的公式推导:dis=min(dis, (g[i][k]+g[k][j]-g[i][j])/2 );
大致为:
在已经绘制好的前k-1个节点的图的基础上,绘制第k个节点,
在前k-1个节点间,枚举端点i,j,找到最短的抽出的分支
#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int N=1e3+10;
int n;
int g[N][N];
int main(){
while(cin>>n&&n){
for (int i = 1; i <= n; ++i) {
for (int j = i+1; j <=n; ++j) {
cin>>g[i][j];
g[j][i]=g[i][j];
}
}
int ans=g[1][2];
for (int k = 3; k <= n; ++k) {//必须从3开始
int t=INF;
for (int i = 1; i < k; ++i) {
for (int j = 1; j <i; ++j) {
t=min(t,(g[i][k]+g[k][j]-g[i][j])/2);
//不断的找出最小的多出来的枝条长度
}
}
ans+=t;
}
cout<<ans<<endl;
}
return 0;
}