日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【POJ3585】Accumulation Degree 二次扫描与换根法

發布時間:2023/12/8 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【POJ3585】Accumulation Degree 二次扫描与换根法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡單來說,這是一道樹形結構上的最大流問題。

樸素的解法是可以以每個節點為源點,單獨進行一次dp,時間復雜度是\(O(n^2)\)
但是在樸素求解的過程中,相當于每次都求解了一次整棵樹的信息,會做了不少的重復工作。
對于一棵子樹的孩子節點和根節點之間存在著最優解的某些關聯,因此可以采用自頂向下的一次 dfs 遍歷求得結果。

階段:子樹大小
狀態:當前子樹大小的情況下,最大的流量是多少
狀態轉移方程:見代碼

代碼如下

#include <cstdio> #include <vector> #include <memory.h> using namespace std; const int maxn=2e5+10;int n,rt,d[maxn],f[maxn],deg[maxn]; struct node{int to,w;node(int x=0,int y=0):to(x),w(y){} }; vector<node> G[maxn];#define cls(a,b) memset(a,b,sizeof(a)) void init(){cls(d,0);cls(f,0);cls(deg,0);for(int i=1;i<=2e5;i++)G[i].clear(); }inline void add_edge(int from,int to,int w){G[from].push_back(node(to,w)),++deg[from];G[to].push_back(node(from,w)),++deg[to]; }void read_and_parse(){scanf("%d",&n);for(int i=1;i<n;i++){int from,to,w;scanf("%d%d%d",&from,&to,&w);add_edge(from,to,w);} }void dfs1(int u,int fa){for(int i=0;i<G[u].size();i++){int v=G[u][i].to,w=G[u][i].w;if(v==fa)continue;dfs1(v,u);if(deg[v]==1)d[u]+=w;else d[u]+=min(w,d[v]);} }void dfs2(int u,int fa){for(int i=0;i<G[u].size();i++){int v=G[u][i].to,w=G[u][i].w;if(v==fa)continue;if(deg[u]==1)f[v]=d[v]+w;else f[v]=d[v]+min(f[u]-min(w,d[v]),w);dfs2(v,u);} }void solve(){rt=1;dfs1(rt,0);f[rt]=d[rt];//自頂向下需要初始化dfs2(rt,0);int ans=0;for(int i=1;i<=n;i++)ans=max(ans,f[i]);printf("%d\n",ans); }int main(){int T;scanf("%d",&T);while(T--){init();read_and_parse();solve();}return 0; }

轉載于:https://www.cnblogs.com/wzj-xhjbk/p/9871141.html

總結

以上是生活随笔為你收集整理的【POJ3585】Accumulation Degree 二次扫描与换根法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。