BZOJ 1570: [JSOI2008]Blue Mary的旅行( 二分答案 + 最大流 )

news/2024/7/8 8:21:20

二分答案, 然后对于答案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;
}

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

 

转载于:https://www.cnblogs.com/JSZX11556/p/5179446.html


http://www.niftyadmin.cn/n/4036201.html

相关文章

受邀Quora,试水麻球

受Quora邀请了&#xff01;有的加我

通过SSH连接N900

N900采用的maemo是基于debian的linux系统&#xff0c;通过自带的application manager管理软件时&#xff0c;操作体验还有待改进&#xff0c;所以这里推荐通过SSH连接&#xff0c;使用cli来进行相应操作。 需要在手机端安装OpenSSH来开启SSH服务&#xff0c;在application mana…

PureMVC总结(附Hello World含PureMVC源码代码和文档)

PureMVC总的流程是&#xff1a; Faade通过一个STARTUP的Command来进行Proxy和Mediator的注册&#xff0c;初始化&#xff08;这样Proxy和Mediator就可以接受Notification消息&#xff09;。 Command通过Faade中注册的对应Notification触发。 Proxy只发送Notification&#xff0…

函数的参数设置

函数的参数设置 默认参数 def power(x, n2):s 1while n > 0:n n - 1s s * xreturn s有几点要注意&#xff1a; 一是必选参数在前&#xff0c;默认参数在后&#xff0c;否则Python的解释器会报错&#xff08;思考一下为什么默认参数不能放在必选参数前面&#xff09;&…

Flash ActionScript (15) as2.0与as3.0区别

学习AS3.0已有一段时间了&#xff0c;想把自已对AS3的一些认识和大家分享一下。主要想说说AS3与AS2的不同之处&#xff0c;没有什么逻辑性&#xff0c;想到什么就写点什么&#xff0c;因此&#xff0c;它不适合AS高手们阅读。本文将力求用最直白的语言&#xff0c;尽量不用那些…

5G时代的材料新宠——液晶高分子聚合物

液晶高分子聚合物时80年代初期发展起来的一种新型高性能工程塑料&#xff0c;英文名为&#xff1a;Liquid Crystal Polymer 简称为LCP。 聚合方法以熔融缩聚为主&#xff0c;全芳香族LCP多辅以固相缩聚以制得高分子量产品。非全芳香族LCP常采用一步或二步熔融聚合制取产品。近年…

Flash/Flex学习笔记(1):Hello World!

万世开头难&#xff0c;先来一个Hello World!吧&#xff0c;Adobe出了二款支持Action Script3语言的经典开发工具&#xff0c;即:Flash CS 与Flash Builder(以前称为Flex Builder)&#xff0c;这二者的关系就好Silverlight中的Blend与Visual Studio 先来看看Flash中如何玩&…

java-mysql类型对照

java mysql 数据类型对照 类型名称显示长度数据库类型JAVA类型JDBC类型索引(int)描述 VARCHARLNVARCHARjava.lang.String12 CHARNCHARjava.lang.String1 BLOBLNBLOBjava.lang.byte[]-4 TEXT65535VARCHARjava.lang.String-1 INTEGER4INTEGER UNSIGNEDjava.lang.Long4…