Codeforces 1955H 最小费用流 / DP

题意

传送门 Codeforces 1955H The Most Reckless Defense

题解

不同塔对敌人的贡献是独立的。考虑任一座塔,赋予其 r r r的攻击范围,则其对敌人的造成伤害的上界为 n m p < 3 l g , l g = 13 nmp<3^{lg},lg=13 nmp<3lg,lg=13,则当 r ≥ l g r\geq lg rlg,则塔对敌人造成的伤害与初始化增加的生命值两者的总贡献为正,此时显然取 r = 0 r=0 r=0更优。故只需考虑 r < l g r< lg r<lg的情况。分别以塔和 r r r为左右节点构造带权二分图,问题转化为求匹配数任意情况下的最小权匹配。构造邻接矩阵的时间复杂度为 O ( l g 3 × k ) O(lg^{3}\times k) O(lg3×k)

最小费用流

新增源点、汇点,将带权二分图建模为网络流,构造势函数保证边权非负,使用dijkstra算法不断增广。图中带负权边,为了构造势函数,可以初始化时使用Bellman-Ford算法;而此处的图具备良好的性质,即每次增广所用的边数 k k k都是相等的(不妨假设增广路中每条反向边可以抵消一条原边),即 k = 1 k=1 k=1,此时只需为每条边加上一个 d d d转化为非负权值,每次求增广路时减去 k × d k\times d k×d即可还原得到原始路径权值。

那么对于流量任意的最小费用流,只需在残余网络存在权值为负的路径情况下不断增广。令二分图左部点数量为 n = l g n=lg n=lg,右部点数量为 m = k m=k m=k,则总时间复杂度 O ( n 2 m log ⁡ ( n + m ) ) O\big(n^2m\log(n + m)\big) O(n2mlog(n+m))

tourist的这份提交似乎实现了一种不需要保证完备匹配的Hungarian算法,其复杂似乎是 O ( n 2 m ) O(n^2m) O(n2m)

#include <bits/stdc++.h>
using namespace std;
constexpr int INF = 1e9;
struct MinimumCostFlow {
   
   
    struct Edge {
   
   
        int to, cost, cap, rev;
    };
    vector<vector<Edge>> g;
    vector<int> h, used, ds;
    vector<int> prevv, preve;
    int delta;

    MinimumCostFlow(int n, int d) : g(n), h(n), used(n), ds(n),
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值