观察到性质:每个点都会被算至少一次,因为将其变成单点的一步一定计入了这个点的贡献

所以最优解就是以最小的点为根,让其它点作为叶子一个一个打掉,这样除了最小的点,每个点都只被算一次。而这个可以直接通过 a 数组的最小值和总和得出。甚至不需要输入树,也不需要存储 a 数组

#include <iostream>
using namespace std;

using ll = long long;

int n;

void Solve() {
    cin >> n;
    int a;
    cin >> a;
    ll suma = a;
    int mina = a;
    for (int i = 1; i < n; i++) {
        cin >> a;
        suma += a;
        mina = min(mina, a);
    }
    cout << (ll)(n - 2) * mina + suma;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    Solve();
    return 0;
}