思路
假设总共 个城市构成了一棵树,任意一条边,都会将城市分成两部分,假设左边有
个,则右边有
个,那么左侧的每个城市和右侧的每个城市都会相连,即经过该边
次,一旦被破坏,造成的损失是
,只需在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;
}
}; 
京公网安备 11010502036488号