第五届上海理工大学程序设计全国挑战赛A. Another Walk Alone Problem · znzryb
## 思路讲解
看了题解以后,我们发现有些时候我们不一定要全部依赖树状dp得出答案。
```cpp
auto dfs=[&](auto &&self,ll u,ll cur,ll gain,ll de)->void{ // 在外面调用的时候dfs(dfs,u)
vis[u]=true;dp[u]=cur;
for(int i=0;i<g[u].size();++i){
ll v=g[u][i][0],w=g[u][i][1];
if(vis[v]) continue;
if(cur+gain+A[u]-de>=w){
self(self,v,cur,gain+A[u],de+w);
}else{
self(self,v,w-gain-A[u]+de,gain+A[u],de+w);
}
}
for(int i=0;i<g[u].size();++i){
ll w=g[u][i][1],v=g[u][i][0];
if(w*2<A[u]+A[v] && A[u]>=w){
inf.push_back(dp[u]); // 无限循环所需要的值
break;
}
}
};
```
## AC代码
[https://ac.nowcoder.com/acm/contest/view-submission?submissionId=78031630](https://ac.nowcoder.com/acm/contest/view-submission?submissionId=78031630)
::: 源代码
```cpp
// Problem: Another Walk Alone Problem
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/111679/A
// Memory Limit: 2048 MB
// Time Limit: 4000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include <bits/stdc++.h>
#define debug(x) cerr<<#x<<":"<<x<<"\n";
using namespace std;
using ll = long long;
constexpr ll MAXN=(ll)1e6+10;constexpr ll INF=(ll)1e17+9;
constexpr ll mod=(ll)1e9+7;constexpr double eps=1e-8;const double pi=acos(-1.0);
/*
*/
ll A[MAXN];
inline void solve(){
ll N;cin>>N;
vector<vector<array<ll,2> > > g(N+5);
for(int i=2;i<=N;++i){
cin>>A[i];
}
for(int i=1;i<=N-1;++i){
ll u,v,w;cin>>u>>v>>w;
g[u].push_back({v,w});g[v].push_back({u,w});
}
vector<ll> inf,dp(N+5,0);
vector<bool> vis(N+5,0),isinf(N+5,0);
// map<array<ll,2>,2> mp;
auto dfs=[&](auto &&self,ll u,ll cur,ll gain,ll de)->void{ // 在外面调用的时候dfs(dfs,u)
vis[u]=true;dp[u]=cur;
for(int i=0;i<g[u].size();++i){
ll v=g[u][i][0],w=g[u][i][1];
if(vis[v]) continue;
if(cur+gain+A[u]-de>=w){
self(self,v,cur,gain+A[u],de+w);
}else{
self(self,v,w-gain-A[u]+de,gain+A[u],de+w);
}
}
for(int i=0;i<g[u].size();++i){
ll w=g[u][i][1],v=g[u][i][0];
if(w*2<A[u]+A[v] && A[u]>=w){
inf.push_back(dp[u]);
#ifdef LOCAL
debug(w);debug(A[u]);debug(u);
#endif
break;
}
}
};
dfs(dfs,1,0,0,0);
#ifdef LOCAL
for(int i=2;i<=N;++i){
cerr<<dp[i]<<" ";
}
cerr<<"\n";
for(int i=0;i<inf.size();++i){
cerr<<inf[i]<<" ";
}
cerr<<"\n";
#endif
ll mn=inf.empty()?INF:*min_element(inf.begin(),inf.end());
for(int i=2;i<=N;++i){
cout<<min(dp[i],mn)<<" ";
}
cout<<"\n";
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
ll lT;
cin>>lT;
while(lT--){
solve();
}
// solve();
return 0;
}
/*
*/
```
:::
## 心路历程(WA,TLE,MLE……)