传送门:Problem A: 抢夺

(放不了题面。)

Solution\mathfrak{Solution}Solution

一道很像最大流的费用流。

1

第一眼看过去觉得是分层图。原因:到某个节点时车的状态(第几天)是不同的。

但数据范围明显不让你这么干。

然后就不难想到二分。

二分的明显是天数。

2

如何判断当前天数能否满足题意?

使用增广路来实现。每次找源点和汇点之间的增广路径,因为每走一条路用一天,所以不妨设路径长度都为 1。那么这条增广路的长度就是走这条路所用的天数,记为 disndis_ndisn​。它等价于费用流里的费用。

对于每条路径的限制,将它等价于费用流中的流量。那么最后能从源点走此增广路到汇点的流数量 即为 能同时花 disndis_ndisn​ 天,走此条增广路到终点的人数,记为 incfnincf_nincfn​。

综上,对于一条增广路径而言,假设当前二分出的天数为 midmidmid,有:在 midmidmid 天中,能走这条路到终点的总人数为 (mid−disn+1)×incfn(mid - dis_n +1) \times incf_n(mid−disn​+1)×incfn​。这个很好理解。

3

二分的 check()check()check() 函数:

对于二分到的一个总天数 midmidmid,我们反复寻找增广路经,每找到一条就用 kkk(总人数)减去能走此增广路经的人总数,若 k≤0k\le 0k≤0,证明 midmidmid 可行。

ACCode\mathfrak{AC Code}ACCode

注意每次 check()check()check() 函数前都要重新建边。

#include<bits/stdc++.h>
using namespace std;#define rep(i, a, b) for(int i = a; i <= b; ++i)
#define maxn 2005
#define maxm 10005
#define inf 2147483647int n, m, k;
int cnt = 1, hd[maxn];
struct node{int to, nxt, flw, cst;
}e[maxm];
int ui[maxm], vi[maxm], fi[maxm];
int dis[maxn], incf[maxn];
int pre[maxn];
int l, r;
int s, t;
bool vis[maxn];inline void init()
{l = r = s = t = 0;cnt = 1;
}inline void add(int u, int v, int f)
{e[++cnt] = (node){v, hd[u], f, 1};hd[u] = cnt;e[++cnt] = (node){u, hd[v], 0, -1};hd[v] = cnt;
}inline int read()
{int x = 1, ss = 0;char ch = getchar();while(ch < '0' or ch > '9'){if(ch == '-') x = -1; ch = getchar();}while(ch >= '0' and ch <= '9') ss = ss * 10 + ch - '0', ch = getchar();return x * ss;
}inline bool spfa()
{queue <int> q;rep(i, 0, n + 10) dis[i] = inf;memset(vis, 0, sizeof vis);vis[1] = 1, q.push(1), dis[1] = 0;    incf[1] = inf;while(!q.empty()){int u = q.front();q.pop();vis[u] = 0;for(int i = hd[u], v; i; i = e[i].nxt){if(!e[i].flw) continue;if(dis[v = e[i].to] > dis[u] + e[i].cst){dis[v] = dis[u] + e[i].cst;incf[v] = min(incf[u], e[i].flw);pre[v] = i;if(!vis[v]) vis[v] = 1, q.push(v);}}}return dis[n] != dis[n + 1];
}inline bool check(int day)
{int tmp = k;while(spfa()){if(day - dis[n] + 1 < 1) return 0;tmp -= (day - dis[n] + 1) * incf[n];if(tmp <= 0) return 1;int x = n, i;while(x != 1){i = pre[x];e[i].flw -= incf[n], e[i ^ 1].flw += incf[n];x = e[i ^ 1].to;}}return 0;
}signed main()
{int u, v, f;while(scanf("%d%d%d", &n, &m, &k) != EOF){init();rep(i, 1, m) {ui[i] = read() + 1, vi[i] = read() + 1,fi[i] = read();}if(!k){printf("0\n");continue;}l = 0, r = k << 1;int flg = -1;while(l < r){ int mid = l + r >> 1;cnt = 1, memset(hd, 0, sizeof hd);rep(i, 1, m) add(ui[i], vi[i], fi[i]);if(check(mid)) r = flg = mid;else l = mid + 1;}if(~flg) printf("%d\n", flg);else puts("No solution");}return 0;
}

——End\mathfrak{End}End——

【XSY-Contest2618.Problem A】抢夺相关推荐

  1. linux下yum错误:[Errno 14] problem making ssl connection Trying other mirror.

    所有的base 都要取消注释 mirrorlist 加上注释 另外所有的enable都要设为零 目录 今天是要yum命令安装EPEL仓库后 yum install epel-release 突然发现y ...

  2. A + B Problem

    1001: A + B Problem Description 计算 A + B. Input 多组测试数据,每组测试数据占一行,包括2个整数. Output 在一行中输出结果. Sample Inp ...

  3. Error:(49, 1) A problem occurred evaluating project ':guideview'. Could not read script 'https://r

    出现问题如下: Error:(49, 1) A problem occurred evaluating project ':guideview'. > Could not read script ...

  4. #418 Div2 Problem B An express train to reveries (构造 || 全排列序列特性)

    题目链接:http://codeforces.com/contest/814/problem/B 题意 : 有一个给出两个含有 n 个数的序列 a 和 b, 这两个序列和(1~n)的其中一个全排列序列 ...

  5. ADPRL - 近似动态规划和强化学习 - Note 3 - Stochastic Infinite Horizon Problem

    Stochastic Infinite Horizon Problem 3.Stochastic Infinite Horizon Problem 定义3.1 无限范围的马尔可夫决策过程 (Marko ...

  6. ADPRL - 近似动态规划和强化学习 - Note 2 - Stochastic Finite Horizon Problem

    2. Stochastic Finite Horizon Problem 在这一节中主要介绍了随机DP算法来解决不确定性下的有限地范围问题,如Denition 1.4所述,它被表述为一个组合优化问题. ...

  7. There was a problem confirming the ssl certificate ……

    在安装一个Python库onetimepass时发生下面的问题: pip install onetimepass Could not fetch URL https://pypi.python.org ...

  8. HDU 1757 A Simple Math Problem

    Problem Description Lele now is thinking about a simple function f(x). If x < 10 f(x) = x. If x & ...

  9. The C10K problem原文翻译

    原文地址:http://www.cnblogs.com/fll/archive/2008/05/17/1201540.html The C10K problem 如今的web服务器需要同时处理一万个以 ...

最新文章

  1. LeetCode 3 无重复字符的最长子串
  2. javascript变量提前声明
  3. BZOJ2194 快速傅立叶之二 【fft】
  4. 第十四天:规划质量管理,一致性成本、非一致性成本、质量七工具
  5. [Redux/Mobx] 在redux中,什么是store?
  6. CANopen | 对象字典OD 04 - 创建对象字典的变量(映射变量)
  7. 你确定你真的理解“双亲委派“了吗?!
  8. centos7 ifconfig命令找不到_Linux基础命令大全,你找不到的这都有
  9. gitbook使用及book.json详细配置
  10. python判断日期为第几天_python怎么判断某一天是一年中的第几天
  11. [WPF]c#调用默认浏览器打开网址
  12. linux中最常用命令
  13. write.csv()函数--R语言
  14. 机器人机构学基础(朱大昌)第三章部分习题答案
  15. 人脸识别库Dlib介绍
  16. 全国各省份简称、省会、经纬度
  17. 酱茄社区论坛圈子小程序pro更新与WordPress开源版小程序下载
  18. pdf转换成jpg图片不清晰怎么办?
  19. Home Barbering Grows In Recession, With Hairy Results
  20. 为测试者布道,腾讯互娱总监魏学峰分享手游研测干货

热门文章

  1. J2EE的13个标准(规范)
  2. 使用jmeter进行api接口压力测试
  3. 人工智能 - A*算法解决迷宫问题 附源码和可视化显示
  4. 文件夹的隐藏选项为灰色勾选,无法更改或删除
  5. mysql 查询半径范围内经纬度坐标
  6. STM32 定时器中断相关知识及配置
  7. Html Table 合并单元格
  8. Mybatis的bind标签
  9. Linux--系统安全及应用
  10. 基于SSM的学生信息管理系统的设计