思路

假设总共 个城市构成了一棵树,任意一条边,都会将城市分成两部分,假设左边有 个,则右边有 个,那么左侧的每个城市和右侧的每个城市都会相连,即经过该边 次,一旦被破坏,造成的损失是 ,只需在dfs过程中取一下每条边贡献的最大值即可,时间复杂度

如下图所示:
图片说明

Code

class Solution {
#define ll long long
#define maxn 100010
#define pii pair<int, int>
private:
    int n;
    int sz[maxn];  // sz[x] 表示结点 x 的子树结点数量
    ll ans;
    vector<pii> g[maxn];  // 保存边。

public:
    void dfs(int x, int fa = 0) {
        sz[x] = 1;
        for (auto cur: g[x]) {
            int v = cur.first, w = cur.second;
            if (v == fa) continue;
            dfs(v, x);
            sz[x] += sz[v];
            ll tmp = 1ll * sz[v] * (n - sz[v]) * w;  // 计算该边对链路的影响
            ans = max(ans, tmp);
        }
    }

    ll solve(int n, vector<int> u, vector<int> v, vector<int> w) {
        this->n = n;
        for (int i = 1; i < n; ++i) {
            int a = u[i - 1], b = v[i - 1], c = w[i - 1];
            g[a].push_back({b, c});
            g[b].push_back({a, c});
        }
        dfs(1);
        return ans;
    }

};