题目大意:求所有最短路之和
本题有点误导性,若使用dijkstra算法计算最短路的话会超时,那该咋办呢?
思路解析:
将计算边权的绝对值拆开来看就是 = 。很显然,任意两点间的最短距离就是该两点的直接距离,假设我们绕路的话从u到v的权值就是2*max(,)+2*max(,)>2*max(,)。我们先对顶点的值排个序,假设小到大排序的顶点值的为a,b,c,d,e,f。
起点权值 | b | c | d | e |
a | b | c | d | e |
b | b(b>a所以此处为max(a,b)) | c | d | e |
c | c(此处为max(a,c)) | c(此处为max(b,c)) | d | e |
d | d(max(a,d)) | d(max(b,d)) | d(max(c,d)) | e(max(e,d)) |
e | e(同上) | e | e | e |
观察表可得ans=2*(2*b+4*c+6*d+8*e)=4*(b+2*c+3*d+4*e)。
废话不多说,代码如下:
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using T = pair<int, int>;
//set<int>S;
//unordered_map<int, int>mp;
const int N = 2e5 + 10;
int a[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int t; cin >> t;
while (t--) {
int n; cin >> n;
int i;
for (i = 1; i <= n; ++i) {
cin >> a[i];
}
sort(a + 1, a + 1 + n);
ll ans{};
for (i = 2; i <= n; ++i)ans += a[i]*(i-1);
cout << 4 * ans << endl;
}
return 0;
}