除了源点之外,树中所有度数为1
的节点都是入海口,可以吸收无限多的水,我们称之为汇点。
也就是说,水系中的水从源点出发,沿着每条河道,最终流向各个汇点。
问最大流量
f[ x] = sum{ min( f[y] ,z) }
换根,考虑 g[x] 流向所有(包括x往上) 时的最大流量
g[y]=f[y]+ min( z, g[x]- min(z, f[y]) )
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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | #include <iostream> #include <cstring> using namespace std; const int N=2e5+30,M=2*N; int all,hd[N],w[M],nxt[M],go[M],n; int g[N],f[N], in [N]; void add( int x, int y, int z){ go[++all]=y,nxt[all]=hd[x],hd[x]=all; w[all]=z; } void dp( int x, int fa){ int y,z,i; f[x]=0; for (i=hd[x];i;i=nxt[i]){ y=go[i],z=w[i]; if (y==fa) continue ; dp(y,x); if ( in [y]<=1) f[x]+=z; else f[x]+=min(z,f[y]); } } void dfs( int x, int fa){ int y,z,i; for (i=hd[x];i;i=nxt[i]){ y=go[i],z=w[i]; if (y==fa) continue ; if ( in [x]==1) g[y]=z+f[y]; else g[y]=f[y]+min(g[x]-min(f[y],z),z); dfs(y,x); } } signed main(){ int i,tes; cin>>tes; while (tes--){ cin>>n; int x,y,z; for (i=1;i<=n;i++) f[i]=g[i]= in [i]=hd[i]=0; all=0; for (i=1;i<n;i++) cin>>x>>y>>z,add(x,y,z),add(y,x,z), in [y]++, in [x]++; dp(1,-1); g[1]=f[1]; dfs(1,-1); int ans=0; for (i=1;i<=n;i++) ans=max(ans,g[i]); cout<<ans<<endl; } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!