【DP(换根 DP)】AcWing 287. 积蓄程度
比较好想的换根 DP,但是有坑点。
我的做法需要的代码行数应该比较少。。去掉头部就 40 行左右。
分析
约定 表示以 为根节点的时候的最大流量, 为 之间的边权。
首先考虑根节点为 的时候如何统计 (也就是统计子树 的结果):
- 的子节点 能够提供的流量为 。
- 因此,相应能够为 提供的贡献为
这样,以 为根节点,我们就能够通过一次 将 的结果处理出来。
需要注意的是,为了保证源点的流量是无穷,我们应该加一个特判:当遇到源点(叶节点)时,首先将其 值设为 ,最后在 后为了保证 值的正确性我们再将其设为 。
下面考虑换根,将所有节点为根的时候的结果再次使用一次 统计出来。
那么转移的过程是:
- 设现在已经处理好了 。
- 考虑使用父节点 的 值更新 ,换句话说就是考虑 能为 提供的流量是多少。
- 那么, 需要加上的是 点减去 所在的子树的贡献 ,也就是:。
但是这里有一个问题:如果父节点 可以作为源点(也就是其度数为 ),会使 为 提供的流量为 。但这个情况其实只会出现于: 为根节点 且 的度数为 的情况,对此特判就好了。
// Problem: 积蓄程度
// Contest: AcWing
// URL: https://www.acwing.com/problem/content/289/
// Memory Limit: 64 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include<bits/stdc++.h>
using namespace std;
#define debug(x) cerr << #x << ": " << (x) << endl
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define dwn(i,a,b) for(int i=(a);i>=(b);i--)
#define pb push_back
#define all(x) (x).begin(), (x).end()
#define x first
#define y second
using pii = pair<int, int>;
using ll = long long;
inline void read(int &x){
int s=0; x=1;
char ch=getchar();
while(ch<'0' || ch>'9') {if(ch=='-')x=-1;ch=getchar();}
while(ch>='0' && ch<='9') s=(s<<3)+(s<<1)+ch-'0',ch=getchar();
x*=s;
}
const int N=4e5+5, INF=0x3f3f3f3f;
vector<pii> g[N];
int f[N];
int n;
void dfs1(int u, int fa){
f[u]=(g[u].size()==1 && u!=1? INF: 0);
for(auto [go, w]: g[u]){
if(go==fa) continue;
dfs1(go, u);
f[u]+=min(w, f[go]);
}
}
void dfs2(int u, int fa){
for(auto [go, w]: g[u]){
if(go==fa) continue;
f[go]+=min(w, (u==1 && g[u].size()==1? INF: f[u])-min(w, f[go]));
dfs2(go, u);
}
}
int main(){
int T; cin>>T;
while(T--){
cin>>n;
rep(i,1,n-1){
int u, v, w; read(u), read(v), read(w);
g[u].pb({v, w}), g[v].pb({u, w});
}
dfs1(1, 0);
rep(i,1,n) if(f[i]==INF) f[i]=0;
dfs2(1, 0);
int res=0;
rep(i,1,n) res=max(res, f[i]);
cout<<res<<endl;
rep(i,1,n<<1) g[i].clear();
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】