【题解】洛谷 P2052 [NOI2011] 道路修建
链接:洛谷
观察到该图有
考虑对它进行 dfs,求出对于每一个节点
在 dfs 的过程中计算即可。
注意:无向图,开 long long
,取绝对值用 llabs
。
#include <bits/stdc++.h>
using namespace std;
namespace Prulystic { void Main(); }
int main(){
Prulystic::Main();
return 0;
}
namespace Prulystic{
using ll = long long;
using pll = pair<ll, ll>;
const int N = 2e6 + 5;
ll n, ans, son[N];
vector<pll> g[N];
inline void read(ll& x){
ll s = 0, w = 1; char ch = getchar();
while(ch < '0' || ch > '9') { w = (ch == '-' ? -1 : w); ch = getchar(); }
while(ch >= '0' && ch <= '9') { s = s * 10 + ch - '0'; ch = getchar(); }
x = s * w;
return;
}
inline void write(ll x){
if(x < 0) { x = -x; putchar('-'); }
if(x > 9) write(x / 10);
putchar(x % 10 + '0');
return;
}
inline void write(ll x, char ch) { write(x); putchar(ch); }
inline void add(ll a, ll b, ll c){
g[a].push_back({b, c}), g[b].push_back({a, c});
return;
}
void dfs(int u, int f){
son[u] = 1;
for(pll e : g[u]){
ll v = e.first, w = e.second;
if(v == f)
continue;
dfs(v, u);
son[u] += son[v];
ans += llabs(n - 2 * son[v]) * w;
}
return;
}
void Main(){
read(n);
for(int i = 1; i <= n - 1; i++){
ll a, b, c; read(a), read(b), read(c);
add(a, b, c);
}
dfs(1, 0);
write(ans, '\n');
return;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」