链接
https://ac.nowcoder.com/acm/contest/370/F
题意
边权树形图上删去一些边使所有的叶子节点都无法到达根节点,求删去边的权值和的最小值
思路
树形 DP
让子树上的叶子节点和根节点不连通,显然只有两种情况:让叶子节点断开或让子树断开
记 $f[x]$ 为让 $x$ 的子树上的叶子节点与根节点断开的最小代价,$dist[x]$ 为 $x$ 与其父亲节点之间的距离:
$f[x]=min(sum(f[y]),dist[x])(y \in son(x))$
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| #include<bits/stdc++.h> using namespace std; #define pb push_back #define fi first #define se second typedef long long ll; typedef pair<int,int> pii; const int N=100010; int n,m,s; vector<pii>edge[N]; ll f[N]; void dfs(int u,int fa,ll w) { ll tot=0; for(auto x:edge[u]) { if(x.fi==fa) continue; dfs(x.fi,u,x.se); tot+=f[x.fi]; } if(tot) f[u]=min(w,tot); else f[u]=w; } int main() { ios::sync_with_stdio(false); cin.tie(0); cin>>n>>m>>s; for(int i=1;i<=m;i++) { int u,v,w; cin>>u>>v>>w; edge[u].pb({v,w}); edge[v].pb({u,w}); } memset(f,0x3f,sizeof f); dfs(s,0,1e18); cout<<f[s]<<endl; return 0; }
|