最大流思维题-5639Deletion&bzoj3130费用流&3716: [PA2014]Muzeum

传送门:
hdu5639
bzoj3130
bzoj3716


hdu5639

关键性质:
“每次只能选出基环树/树”相当于给无向边定向,使得每个点出度 ≤ 1 \leq 1 1

二分答案跑最大流即可。


bzoj3130

推推式子发现最优答案是流量最大的边的流量 × P \times P ×P
于是二分边容量上限即可。
(注意流量是实数)


bzoj3716

最小割做法不解释(最大权闭合子图问题)。

考虑最小割的对偶问题最大流:
等价于保安点喷出 b v i bv_i bvi单位的水,每个珠宝点可以储 a v i av_i avi单位的水。保安点喷出的水只能由指定范围内的珠宝点储存。最大流即最多可以喷出多少单位的水且由珠宝点储存。

由于喷射范围的有序性,可以将所以点先拉伸坐标系使得视野呈直角。
然后再45度旋转。

将所有点按 x x x排序后只需要用set维护 y y y值。扫到保安点时set查找 ≤ y i \leq y_i yi y y y最大的珠宝点接水(接满了就找第二大的解,贪心处理)即可。

详细题解-WerKeyTom_FTD

### 关于二叉排序树习2、3、4的解答与解析 #### 习2:计算特定高度下的最大节点数 对于给定的高度 \( h \),可以利用公式来推导出不同高度下平衡二叉树的最大节点数目。具体来说: - 当高度为0时,即不存在任何节点,因此 \( n_0 = 0 \)[^1]。 - 对于高度为1的情况,则只有一个根节点存在,故而 \( n_1 = 1 \)。 - 随着高度增加到2,此时除了根节点外还会有两个子节点,使得总数达到2,也就是 \( n_2 = 2 \)。 当继续增长至更高层次时,可以通过递归关系式 `n_h = n_(h−1) + n_(h−2) + 1` 来求解更深层次的最大节点数量[^2]。例如,在高度为3的情况下,\( n_3 = n_2 + n_1 + 1 = 4 \); 同理可得后续各层的最大节点数分别为7, 12, 20 和 33 等等。 ```python def max_nodes(height): if height == 0: return 0 elif height == 1: return 1 else: nodes = [0, 1] for i in range(2, height + 1): new_node_count = nodes[i - 1] + nodes[i - 2] + 1 nodes.append(new_node_count) return nodes[-1] print(max_nodes(6)) # 输出对应高度的最大节点数 ``` 此函数实现了上述逻辑并返回指定高度对应的最多可能拥有的节点数目。 --- #### 习3:删除操作及其影响分析 在处理二叉排序树中的删除请求时,通常会遇到三种情形之一:被删节点无子女、仅有一个直系后代或是拥有两个直接继承者(左右子树均不为空)。针对最后一种情况,有两种主要策略可供选择[^3]。 ##### 方案A: 如果目标节点P具备左侧分支,那么应当定位到这个左支末端最右侧的位置——记作R,并让后者接替原位置上的角色;与此同时调整原先位于R处的数据结构使其父级指向新的右邻接点(原本属于R本身的左子树)。 ##### 方案B: 另一种方法是在确认待移除元素确实含有左边部分之后,简单地令其左儿子占据空缺位;随后再寻找新加入者的极右端成员并将旧对象剩余的部分嫁接到那里去。 这两种途径都能有效维持原有顺序特性不变的同时完成必要的结构调整工作。 ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def deleteNode(root: TreeNode, key: int) -> TreeNode: if not root: return None if key < root.val: root.left = deleteNode(root.left, key) elif key > root.val: root.right = deleteNode(root.right, key) else: if not (root.left or root.right): # No child case root = None elif root.left is None: # One child on the right side only root = root.right elif root.right is None: # One child on the left side only root = root.left else: # Two children present temp = find_max_in_left_subtree(root.left) root.val = temp.val root.left = deleteNode(root.left, temp.val) return balance_tree(root) def find_max_in_left_subtree(node: TreeNode) -> TreeNode: while node and node.right: node = node.right return node def balance_tree(node: TreeNode) -> TreeNode: """This function would contain logic to rebalance tree after deletion.""" pass ``` 这段代码展示了如何实现基于方案A的删除算法,同时也预留了一个用于重新平衡树形结构的地方以便进一步完善功能。 --- #### 习4:构建高效查询机制 为了提高查找效率,可以在设计之初就考虑引入自适应调整机制,比如通过旋转等方式保持整棵树处于相对均衡状态之下。这样做的好处在于能够显著减少平均访问路径长度,从而加快检索速度。此外,还可以采用诸如红黑树这样的高级数据结构形式来自动维护这种性质而不必每次都手动干预。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值