二次扫描与换根法

用于解决无根树,对于每一个节点作为根时都要统计

做法:

1.先以任意一个节点为根,做树形DP,保存每个节点的DP值

2.然后自上而下dfs,对于每个节点考虑以他为根的最大值

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 200505;
int init() {
int rv = 0, fh = 1;
char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') fh = -1;
c = getchar();
}
while(c >= '0' && c <= '9'){
rv = (rv<<1) + (rv<<3) + c -'0';
c = getchar();
}
return fh * rv;
}
int T, n, f[MAXN], c[MAXN], degree[MAXN], head[MAXN], nume, rot;
bool fff[MAXN];
struct edge{
int to, nxt, flow;
}e[MAXN << 1];
void adde(int from, int to, int flow) {
e[++nume].to = to;
e[nume].flow = flow;
e[nume].nxt = head[from];
head[from] = nume;
}
void dfs1(int u) {
fff[u] = 1;
for(int i = head[u]; i ; i = e[i].nxt) {
int v = e[i].to;
if(fff[v]) continue;
if(degree[v] == 1) {f[u] += e[i].flow;}
else {dfs1(v); f[u] += min(f[v], e[i].flow);}
}
}
void dfs2(int u) {
fff[u] = 1;
for(int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if(fff[v]) continue;
c[v] = f[v];
if(degree[u] == 1) c[v] += e[i].flow;
else {
c[v] += min(c[u] - min(f[u], e[i].flow), e[i].flow);
}
dfs2(v);
}
}
int main() {
T = init();
while(T--) {
n = init();
memset(fff, 0, sizeof(fff));
memset(f, 0, sizeof(f));
memset(c, 0, sizeof(c));
memset(degree, 0, sizeof(degree));
memset(head, 0, sizeof(head));
memset(e, 0, sizeof(e));
nume = 0;
for(int i = 1; i < n; i++) {
int u = init(), v = init(), flow = init();
adde(u, v, flow); adde(v, u, flow);
degree[u]++; degree[v]++;
}
rot = 1;
dfs1(rot);
c[rot] = f[rot];
memset(fff, 0, sizeof(fff));
dfs2(rot);
int ans = 0;
for(int i = 1;i <= n; i++) ans = max(ans, c[i]);
cout << ans << endl;
} return 0;
}

最新文章

  1. iOS——Core Animation 知识摘抄(三)
  2. JS刷新页面总和!多种JS刷新页面代码!
  3. post提交与get提交的一个小知识点
  4. 【图论】Codeforces 711D Directed Roads
  5. ZendFramework 环境部署
  6. ubuntu14.04下安装有道词典
  7. centos 7 最小安装后 安装FTP服务器 vsftp
  8. 全部用startssl生成的证书,配置Apache使其支持SSL
  9. Flex中的FusionCharts 3D柱形图
  10. DB Query Analyzer 6.04 is distributed, 78 articles concerned have been published
  11. Docker系列教程02-MongoDB默认开启鉴权
  12. 4月10日java多线程3
  13. 51Nod 1705 七星剑
  14. ZigBee基础
  15. postgresql-死锁
  16. Asp.net core中的依赖注入
  17. 使用Axure RP原型设计实践05,了解公式
  18. 大数据智能SOC解决方案
  19. OLE工具套件分析OFFICE宏恶意样本
  20. java.lang下面有一个接口:Comparable(可比较的)

热门文章

  1. windows定时任务小注
  2. UVA - 12264 Risk (二分,网络流)
  3. nginx的web基础
  4. 屏蔽Alt+F4关闭窗体
  5. python暴力破解wifi密码程序
  6. shell脚本,awk实现每个数字加1.
  7. 设置section的距离
  8. c++ 递归求一个数的阶乘
  9. LeetCode 买卖股票的最佳时机 II
  10. centOS下SVN安装和配置