当只有两个点时,很明显
ans=disi,j
a
n
s
=
d
i
s
i
,
j
当有三个点时
ans=x+y=dis1,2+x
a
n
s
=
x
+
y
=
d
i
s
1
,
2
+
x
由容斥原理得
x=dis1,3+dis2,3−dis1,22
x
=
d
i
s
1
,
3
+
d
i
s
2
,
3
−
d
i
s
1
,
2
2
推广到三个以上的点得
xk=min1<i<kdis1,k+disi,k−dis1,i2
x
k
=
m
i
n
1
<
i
<
k
d
i
s
1
,
k
+
d
i
s
i
,
k
−
d
i
s
1
,
i
2
于是求和就好啦
Code:
#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;
int n,a[50][50];
int main()
{
while(~scanf("%d",&n)& n)
{
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
{
scanf("%d",&a[i][j]);
a[j][i]=a[i][j];
}
int ans=a[1][2];
for(int i=3;i<=n;i++)
{
int mins=0x7f;
for(int j=2;j<i;j++)
mins=min(mins,(a[1][i]+a[j][i]-a[1][j])>>1);
ans+=mins;
}
printf("%d\n",ans);
}
}