生活随笔
收集整理的這篇文章主要介紹了
                                
Accumulation Degree -换根dp
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.                        
 
                                
                            
                            
                            本代碼現(xiàn)在在Poj上無法AC,請謹(jǐn)慎參考
 
因?yàn)檫@個(gè)換根比較簡單,只簡述一下要維護(hù)的東西:
 1,每個(gè)節(jié)點(diǎn)維護(hù)一個(gè)weight[],表示從葉子到根的方向,這個(gè)點(diǎn)最多能接納的流量。
 2,邊權(quán)。
 所以畫畫圖,手動(dòng)模擬一下就得出了以下轉(zhuǎn)移:
 
void dfs2(int u
,int fa
)
{for (int i 
= head
[u
]; i 
; i 
= a
[i
].next
) {int v 
= a
[i
].to
;if (v 
== fa
) continue;int now 
= res
[u
] - a
[i
].w
;int c 
= 0;c 
+= min(a
[i
].w
,now
);for (int j 
= head
[v
]; j 
; j 
= a
[j
].next
) {int vv 
= a
[j
].to
;if (vv 
== u
) continue;c 
+= min(a
[j
].w
,weight
[vv
]);}
res
[v
] = c
;dfs2(v
,u
);}
}
 
簡單來說每個(gè)點(diǎn)的答案就是把當(dāng)前節(jié)點(diǎn)v周圍的流量重新再加起來。這個(gè)可以由weight[],邊權(quán),res[u]得出。
 注意這里是順推,因?yàn)橄乱粋€(gè)答案應(yīng)有上一個(gè)答案得出。
 
#include "bits/stdc++.h"
using namespace std
;
const int maxn 
= 2e5;
struct node{int next
,to
,w
;
}a
[maxn
<<1];
int cnt
;
int head
[maxn 
<< 1];
void add(int u
,int v
,int w
)
{a
[++cnt
].to 
= v
;a
[cnt
].w 
= w
;a
[cnt
].next 
= head
[u
];head
[u
] = cnt
;
}int weight
[maxn
];
void dfs(int u
,int fa
)
{if (a
[head
[u
]].to 
== fa 
&& !a
[head
[u
]].next
){weight
[u
] = 0x3f3f3f3f;return;}int w 
= 0;for (int i 
= head
[u
]; i 
; i 
= a
[i
].next
) {int v 
= a
[i
].to
;if (v 
== fa
) continue;dfs(v
,u
);w 
+= min(weight
[v
],a
[i
].w
);}weight
[u
] = w
;}
int res
[maxn
];
void init()
{cnt 
= 0;memset(head
,0,sizeof(head
));memset(a
,0,sizeof(a
));memset(res
,0,sizeof(res
));
}void dfs2(int u
,int fa
)
{for (int i 
= head
[u
]; i 
; i 
= a
[i
].next
) {int v 
= a
[i
].to
;if (v 
== fa
) continue;int now 
= res
[u
] - a
[i
].w
;int c 
= 0;c 
+= min(a
[i
].w
,now
);for (int j 
= head
[v
]; j 
; j 
= a
[j
].next
) {int vv 
= a
[j
].to
;if (vv 
== u
) continue;c 
+= min(a
[j
].w
,weight
[vv
]);}
res
[v
] = c
;dfs2(v
,u
);}
}
signed main()
{
int T
;cin 
>> T
;while (T
--){init();int n
;cin 
>> n
;for (int i 
= 1; i 
<= n 
- 1; ++i
) {int u
,v
,w
;cin 
>> u 
>> v 
>> w
;add(u
,v
,w
);add(v
,u
,w
);}int ans 
= 0;dfs(1,0);res
[1] = weight
[1];dfs2(1,0);for (int i 
= 1; i 
<= n
; ++i
) {
ans 
= max(ans
,res
[i
]);}cout 
<< ans 
<< endl
;}}
                            總結(jié)
                            
                                以上是生活随笔為你收集整理的Accumulation Degree -换根dp的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                            
                                如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。