题意:
n ~n~ n 个点,给你一个数组 d [ i ] ~d[i]~ d[i] ,表示第 i ~i~ i 个点到第一个点的最短距离。要求你加边,然后使得所有边权和最小,可以加负边。
- 样例
- 思路
很明显其实, d [ i ] ~d[i]~ d[i] 其实可以排个序,对于最后结果并没有影响,之后我们可以考虑对于每个点,只建一条正向道路,使得满足题目条件,然后在满足题目条件的情况下尽可能多地建反向道路,这样可以减小总的边权和。
别忘了最后再加上 d [ n ] ~d[n]~ d[n] . - 代码
#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
int t, n, d[N];
int main()
{
scanf("%d", &t);
for (; t; --t){
scanf("%d", &n);
for (int i = 1; i <= n; ++i)
scanf("%d", &d[i]);
sort(d + 1, d + n + 1);
long long ans = 0, sum = 0;
for (int i = 1; i <= n; ++i){
ans -= 1ll * d[i] * (i - 1) - sum;
sum += d[i];
}
ans += d[n];
printf("%lld\n", ans);
}
return 0;
}