生活随笔
收集整理的這篇文章主要介紹了
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ò),歡迎將生活随笔推薦給好友。