题目大意

​ 给定一颗 \(N\) 个点的有根树,其中 \(1\) 是树根,除了 \(1\) 以外的其他点 \(u\) 有唯一的父亲 \(Father_u\)。同时,给定 \(M\) 条路径,第 \(i\) 条路径是 \((s_i,t_i)\),保证 \(s_i\) 是 \(t_i\) 的祖先。你可以任意选择若干条路径。如果第 \(i\) 条路径被选择,那么你可以得到 \(V_i\) 的收益,这里保证 \(V_i\) 是非负的。

​ 同时,对于每个不是 \(1\) 的点 \(u\),考虑其连接它的父亲 \(Father_u\) 的边,如果有 \(x\) 条覆盖了它且被选择的路径,需要花费代价 \(A_u\times x^2+B_u\times x\),这里也保证 \(A_u\) 和 \(B_u\) 是非负的。代价的含义就是收益要减去这么多,相当于负的收益。

​ 你需要求出在以上条件下你的最大收益。

数据范围:\(1\leq N,M\leq 150\),\(\forall2\leq u\leq N,0\leq A_u \leq 100,0\leq B_u \leq 10000\),\(\forall 1\leq i \leq M,0\leq V_i \leq 10^6\),并保证 \(s_i\) 总是 \(t_i\) 的祖先。

时间限制:1000ms

空间限制:1024MB

解题思路

题解直接给出了费用流的建图方案,然后证明正确性,这里还是想想要如何想到使用费用流。

数据范围只是一个小点,不过确实可以考虑按照数据范围整理一个常用算法表。

关键点应该在于费用是二次的,像这种似乎是很不好处理的,如果是全局二次的话,大概还可以二分或者枚举一下次数,但是这是每条边都是一个二次费用,所以目前所知道的算法里,只有费用流按每次连边能实现这一点,因为对于费用的贪心可以保证按照需要的顺序流过这些流。

于是就考虑建图。费用流有一种常见的做法是先考虑全部都选择,然后计算需要减去的费用, 那么要么是减去 \(v_i\) 直接不选,要么是减去路上的费用,按照这个思路建图就好了。

#include <bits/stdc++.h>
using namespace std; const int N(155), E(N * (N + 3)), INF(1e9); int n, m, fa[N], a[N], b[N], s[N], t[N], v[N];
int ans;
int cnt = 1, head[N];
int S, T, dcnt, dis[N], flo[N], pre[N], inq[N];
struct edge{ int nx, to, v, f; } e[E << 1]; inline void read(int &x){
x = 0; int f = 1, c = getchar();
while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }
while(isdigit(c)) x = x * 10 + c - 48, c = getchar();
x *= f;
} inline void input(){
read(n), read(m);
for(int i(2); i <= n; ++i) read(fa[i]), read(a[i]), read(b[i]);
for(int i(1); i <= m; ++i) read(s[i]), read(t[i]), read(v[i]);
} inline void add(int u, int v, int w, int f){
e[++cnt] = {head[u], v, w, f}, head[u] = cnt;
e[++cnt] = {head[v], u, -w, 0}, head[v] = cnt;
}
inline void prep(){
S = n + 1, T = 1, dcnt = n + 1;
for(int i(2); i <= n; ++i)
for(int j(1); j <= m; ++j) add(i, fa[i], (j * 2 - 1) * a[i] + b[i], 1);
for(int i(1); i <= m; ++i)
add(S, t[i], 0, 1), add(s[i], T, 0, 1), add(t[i], s[i], v[i], 1), ans += v[i];
} bool spfa(){
static queue <int> Q;
for(int i(1); i <= dcnt; ++i) dis[i] = INF;
dis[S] = 0, flo[S] = INF, Q.push(S), inq[S] = 1;
while(!Q.empty()){
int x = Q.front(); Q.pop(), inq[x] = 0;
for(int i(head[x]); i; i = e[i].nx){
int y = e[i].to;
if(dis[y] > dis[x] + e[i].v && e[i].f){
dis[y] = dis[x] + e[i].v;
flo[y] = min(flo[x], e[i].f);
pre[y] = i;
if(!inq[y]) Q.push(y), inq[y] = 1;
}
}
}
return dis[T] != INF;
}
inline void work(){
int mf = 0, mc = 0;
while(spfa()){
mf += flo[T], mc += flo[T] * dis[T];
int now = T;
while(now){
now = pre[now];
e[now].f -= flo[T], e[now ^ 1].f += flo[T];
now = e[now ^ 1].to;
}
}
ans -= mc;
} inline void output(){ printf("%d\n", ans); } int main(){
freopen("tree.in", "r", stdin);
freopen("tree.out", "w", stdout);
input();
prep();
work();
output();
return 0;
}

[题解] 树(tree)的更多相关文章

  1. 树(tree)

    树(tree)[题目描述]从前在森林里面有一棵很大的树,树上住着很多小动物.树上有

  2. JS--插件: 树Tree 开发与实现

    日常在Web项目开发时,经常会碰到树形架构数据的显示,从数据库中获取数据,并且显示成树形.为了方便,我们可以写一个javascript的一个跨浏览器树控件,后续可以重复使用.本节分享一个自己开发的JS ...

  3. POJ1741:Tree——题解+树分治简要讲解

    http://poj.org/problem?id=1741 题目大意:给一棵树,求点对间距离<=k的个数. ———————————————————— 以这道题为例记录一下对于树分治的理解. 树 ...

  4. [LeetCode 题解]: Symmetric Tree

    前言   [LeetCode 题解]系列传送门:  http://www.cnblogs.com/double-win/category/573499.html   1.题目描述   Given a ...

  5. 竞赛题解 - Broken Tree(CF-758E)

    Broken Tree(CF-758E) - 竞赛题解 贪心复习~(好像暴露了什么算法--) 标签:贪心 / DFS / Codeforces 『题意』 给出一棵以1为根的树,每条边有两个值:p-强度 ...

  6. 6359. 【NOIP2019模拟2019.9.15】小ω的树(tree)(定期重构)

    题目描述 题解 qy的毒瘤题 CSP搞这种码农题当场手撕出题人 先按照边权从大到小建重构树,然后40%暴力修改+查找即可 100%可以定期重构+平衡规划,每次把B个询问拉出来建虚树,在虚树上暴力维护每 ...

  7. leetcode题解:Binary Tree Postorder Traversal (二叉树的后序遍历)

    题目: Given a binary tree, return the postorder traversal of its nodes' values. For example:Given bina ...

  8. leetcode 题解:Binary Tree Preorder Traversal (二叉树的先序遍历)

    题目: Given a binary tree, return the preorder traversal of its nodes' values. For example:Given binar ...

  9. 轻量级jquery框架之--树(tree)

    前言 在常用的UI组件中,树形组件与数据列表组件可以说是构成一个管理平台基本的两大数据核心组件.树形组件用于系统菜单,数据列表用于数据表现,两者配合即可完成一个简单的数据系统.要实现一个支持复选.工具 ...

随机推荐

  1. 使用过 Redis 做异步队列么,你是怎么用的?

    答:一般使用 list 结构作为队列,rpush 生产消息,lpop 消费消息.当 lpop 没有 消息的时候,要适当 sleep 一会再重试. 如果对方追问可不可以不用 sleep 呢? list ...

  2. Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否可以实现接口?

    可以继承其他类或实现其他接口,在 Swing 编程和 Android 开发中常用此方式来 实现事件监听和回调.

  3. Django中的信号signals

    什么是信号? jango的信号机制就是事件驱动模型,一个事件可以被多个函数注册,当一个动作行为触发了这个事件后,这个事件所对应的函数便执行相应的操作; 内置信号; django 内部有些定义好的sig ...

  4. 爬虫-数据解析-bs4

    1.数据解析 解析: 根据指定的规则对数据进行提取 作用: 实现聚焦爬虫 数据解析方式: - 正则表达式 - bs4 - xpath 数据解析的通用原理: 数据解析需要作用在页面源码中(一组html标 ...

  5. Spring系列28:@Transactional事务源码分析

    本文内容 @Transactional事务使用 @EnableTransactionManagement 详解 @Transactional事务属性的解析 TransactionInterceptor ...

  6. 基于vue-cli搭了一个多页面应用的空脚手架

    vue2.* (多页面跳转) @[vue2.3.3|webpack2.6.1|less|axios] 之前看过有相关朋友share了空的多页面脚手架. 不过down了几个都是webpack1.0或者v ...

  7. POP3:基于命令行的电子邮件(EMail)在线查看和批量下载工具

    使用该工具可以在不安装outlook和foxmail等邮件客户端的情况下快速下载指定邮箱的邮件,并将下载的邮件以eml格式进行保存. 附: 查看eml格式的邮件可使用 EmlReader 工具,该工具 ...

  8. AS修改text内容+显示不同页面

    新创建一个project,命名为myclass. 一:修改 在res中找到layout打开xml文件,右上角有一个code,点击进入可以写代码的文件,并在里面进行修改.(老版本写代码的界面在下面与de ...

  9. java中单态模式或单例模式(Singleton)有什么意义?

    8.单态模式或单例模式(Singleton) 单态模式有什么用呢?想一下Adobe Photoshop ,处理两张图,会启动两个photoshop吗?多耗费内存呀! ( Consider Adobe ...

  10. android.content.res.Resources$NotFoundException: String resource ID #0x0报错

    报错:android.content.res.Resources$NotFoundException: String resource ID #0x0 原因:在setText()中使用了int型的参数 ...