二分答案, 然后对于答案m, 把地点分成m层, 对于边(u, v), 第x层的u -> 第x+1层的v 连边. 然后第x层的u -> 第x+1层的u连边(+oo), S->第一层的1(PEOPLE_NUMBER), 每一层N -> T(+oo), 假如最大流是等于人数,就是可行答案.

----------------------------------------------------------------------------------------

#include<cstdio>
#include<cstring>
#include<algorithm>
 
using namespace std;
 
#define Id(a, b) ((a) + (b) * N)
 
const int maxn = 59;
const int maxV = 5009;
 
int V, S, T, cnt[maxV], h[maxV];
int d[maxn][maxn], NUM, N;
 
struct edge {
int t, c;
edge *n, *r;
} E[100000], *pt, *e, *H[maxV], *p[maxV], *cur[maxV];
 
inline void Add(int u, int v, int c) {
pt->t = v, pt->c = c, pt->n = H[u], H[u] = pt++;
}
inline void AddEdge(int u, int v, int c) {
Add(u, v, c), Add(v, u, 0);
H[u]->r = H[v], H[v]->r = H[u];
}
 
int maxFlow() {
for(int i = 0; i < V; i++)
cur[i] = H[i], cnt[i] = h[i] = 0;
cnt[0] = V;
int ret = 0;
for(int x = S, A = maxV; h[S] < V; ) {
for(e = cur[x]; e; e = e->n)
if(e->c && h[e->t] + 1 == h[x]) break;
if(e) {
A = min(e->c, A);
p[e->t] = cur[x] = e;
if((x = e->t) == T) {
for(; x != S; x = p[x]->r->t)
p[x]->c -= A, p[x]->r->c += A;
ret += A;
A = maxV;
}
} else {
if(!--cnt[h[x]]) break;
h[x] = V;
for(e = H[x]; e; e = e->n) if(h[e->t] + 1 < h[x] && e->c) {
h[x] = h[e->t] + 1;
cur[x] = e;
}
++cnt[h[x]];
if(x != S) x = p[x]->r->t;
}
}
return ret;
}
 
void Build(int x) {
pt = E;
memset(H, 0, sizeof H);
V = N * x, S = V++, T = V++;
AddEdge(S, 0, NUM);
for(int i = 0; i < x; i++)
AddEdge(Id(N - 1, i), T, maxV);
for(int i = 1; i < x; i++)
for(int j = 0; j < N; j++) {
for(int k = 0; k < N; k++)
if(d[j][k]) AddEdge(Id(j, i - 1), Id(k, i), d[j][k]);
AddEdge(Id(j, i - 1), Id(j, i), maxV);
}
}
 
void Init() {
int m;
scanf("%d%d%d", &N, &m, &NUM);
memset(d, 0, sizeof d);
while(m--) {
int u, v;
scanf("%d%d", &u, &v);
scanf("%d", &d[--u][--v]);
}
}
 
void Work() {
int l = 1, r = 100, ans;
while(l <= r) {
int m = (l + r) >> 1;
Build(m);
if(maxFlow() == NUM) {
ans = m, r = m - 1;
} else
l = m + 1;
}
printf("%d\n", --ans);
}
 
int main() {
Init();
Work();
return 0;
}

----------------------------------------------------------------------------------------

BZOJ 1570: [JSOI2008]Blue Mary的旅行( 二分答案 + 最大流 )的更多相关文章

  1. bzoj 1570: [JSOI2008]Blue Mary的旅行

    Description 在一段时间之后,网络公司终于有了一定的知名度,也开始收到一些订单,其中最大的一宗来自B市.Blue Mary决定亲自去签下这份订单.为了节省旅行经费,他的某个金融顾问建议只购买 ...

  2. bzoj1570: [JSOI2008]Blue Mary的旅行(二分+网络流)

    1570: [JSOI2008]Blue Mary的旅行 题目:传送门 题解: get到拆点新姿势,还是做题太少了...ORZ 因为每天就只能有一个航班,那就不能直接连了,所以要拆点(然后就被卡住了) ...

  3. [BZOJ 1568][JSOI2008]Blue Mary开公司

    [BZOJ 1568][JSOI2008]Blue Mary开公司 题意 \(n\) 次操作, 维护一个一次函数集合 \(S\). 有两种操作: 给定 \(b\) 和 \(k\), 向 \(S\) 中 ...

  4. 【BZOJ1570】[JSOI2008]Blue Mary的旅行 动态加边网络流

    [BZOJ1570][JSOI2008]Blue Mary的旅行 Description 在一段时间之后,网络公司终于有了一定的知名度,也开始收到一些订单,其中最大的一宗来自B市.Blue Mary决 ...

  5. BZOJ 1567: [JSOI2008]Blue Mary的战役地图( 二分答案 + hash )

    二分答案, 然后用哈希去判断... ------------------------------------------------------------------------- #include ...

  6. 数据结构(线段树):BZOJ 1568 [JSOI2008]Blue Mary开公司

    1568: [JSOI2008]Blue Mary开公司 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 602  Solved: 214[Submit ...

  7. bzoj 1568 [JSOI2008]Blue Mary开公司 超哥线段树

    [JSOI2008]Blue Mary开公司 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 1808  Solved: 639[Submit][Sta ...

  8. BZOJ 1567: [JSOI2008]Blue Mary的战役地图

    1567: [JSOI2008]Blue Mary的战役地图 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1011  Solved: 578[Sub ...

  9. BZOJ 1567: [JSOI2008]Blue Mary的战役地图 矩阵二维hash

    1567: [JSOI2008]Blue Mary的战役地图 Description Blue Mary最近迷上了玩Starcraft(星际争霸) 的RPG游戏.她正在设法寻找更多的战役地图以进一步提 ...

随机推荐

  1. 【iOS开发-35】有了ARC内存管理机制,是否还须要操心内存溢出等问题?——面试必备

    答案:必需要操心啊,ARC也不是万能的. 这里主要是涉及到集合类的数据类型. 比方数组,我们定义了一个可变数组muarr1,然后把一个对象p1加到muarr1中,此时会对这个对象retain一次,相当 ...

  2. z-index解决弹出层遮罩层覆盖子div不能显示输出的问题

    // 添加以下代码来进行测试: // ajax 发生错误,就会执行$('body').ajaxError(function(e, xhr, setting, text){    // e - even ...

  3. strcpy, mencpy, memmove三者区别

    首先来看strcpy,目的是实现字符串的复制,这里需要注意几个点: 1.判断指针的有效性 2.将复制后的指针地址返回,为了支持链式操作 3.不要忘记将字符串最后一个自负'\0'复制给dest 4.注意 ...

  4. MySql 优化 网上资料

    1.选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快.因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽 ...

  5. python基础(三)

    set集合 set集合创建 #方式1: se = {'} #与字典类似dict1 = {'k1','v1','k2','v2'} #方式2: se = set() #创建一个空的集合 list1 = ...

  6. python排序(冒泡, 快速)

    之前用java时学习的一些基础算法,今天在python上也研究下. 1. 冒泡排序 算法步骤: 50   30   70  90 10 1)50 跟 30 比不用交换. 2)步数+1, 30 跟70比 ...

  7. jupyter巨好玩-使用jupyter结合VScode写博客

    打开jupyter-ipython 其实人家就叫jupyter了,后面咱可能就少提ipython了. # 打开命令行,让我们输入 jupyter notebook 当然,这个前提是你已经安装了jupy ...

  8. VB MSFlexGrid 用法

    http://blog.itpub.net/15453304/viewspace-445608/ 问题一,MSFlexGrid 点击一行,显示背景颜色,然后得到行号 首先,右键单击Msflexgrid ...

  9. 习惯使用断言Assert

    一直在给党做项目,我们这些可怜兮兮的学生都没太多时间安排自己的活动了,写个blog都要在中午休息的时间. 项目用的是.NET,本来也想分享一些干货点的东西,但博客园里的前辈把这类文章已经分享泛滥了,想 ...

  10. Unicode其实是Latin1的扩展。只有一个低字节的Uncode字符其实就是Latin1字符——附各种字符编码表及转换表

    一.概念 1,ASCII             ASCII(American Standard Code for Information Interchange),中文名称为美国信息交换标准代码.是 ...