luogu1273 有限电视网
题目大意
有一棵有根树,每个结点有一个收益,每条边有一个花费。如果要选择一个叶子结点,则根节点到该叶子结点的路径上的所有结点都必须被选择。求当总收益大于等于总花费的情况下,最多能选择多少个叶子结点。
思路
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | #include <cstdio> #include <cstring> #include <algorithm> #include <cassert> using namespace std; const int MAX_NODE = 3010, MAX_EDGE = MAX_NODE, MINF = 0xcfcfcfcf; int TotNode, TotLeaf; struct Node; struct Edge; struct Node { Edge *Head; int DP[MAX_NODE]; int Val; int LeafCnt; }_nodes[MAX_NODE]; struct Edge { Node *To; Edge *Next; int Cost; }_edges[MAX_EDGE]; int _eCount; void AddEdge(Node *from, Node *to, int w) { Edge *e = _edges + ++_eCount; e->To = to; e->Cost = w; e->Next = from->Head; from->Head = e; } void Dfs(Node *cur) { memset (cur->DP, MINF, sizeof (cur->DP)); cur->DP[0] = 0; if (cur - _nodes > TotNode - TotLeaf) { assert (!cur->Head); cur->DP[1] = cur->Val; cur->LeafCnt = 1; return ; } for (Edge *e = cur->Head; e; e = e->Next) { Dfs(e->To); cur->LeafCnt += e->To->LeafCnt; } for (Edge *e = cur->Head; e; e = e->Next) for ( int j = cur->LeafCnt; j >= 1; j--) for ( int k = 1; k <= min(j, e->To->LeafCnt); k++) cur->DP[j] = max(cur->DP[j], cur->DP[j - k] + e->To->DP[k] - e->Cost); } int main() { scanf ( "%d%d" , &TotNode, &TotLeaf); for ( int i = 1; i <= TotNode - TotLeaf; i++) { int totOut, to, w; scanf ( "%d" , &totOut); for ( int j = 1; j <= totOut; j++) { scanf ( "%d%d" , &to, &w); AddEdge(_nodes + i, _nodes + to, w); } } for ( int i = TotNode - TotLeaf + 1; i <= TotNode; i++) scanf ( "%d" , &_nodes[i].Val); Dfs(_nodes + 1); for ( int j = TotLeaf; j >= 0; j--) { if (_nodes[1].DP[j] >= 0) { printf ( "%d\n" , j); return 0; } } return 0; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥