uva 10983 Buy one, get the rest free 二分判定层次图
二分枚举租用飞机的最大花费,然后用小于等于最大花费的边构建层次图(依据时间)
构图思路: 利用二元组(x,y)表示 x天y城市
1. e天有飞机从a城市飞到b城市,能够承载x人,则添加单向边 ( e, a ) -> ( e+1, b ) 容量为x
2. 每一天的a城市到第二天的a城市连边,容量为正无穷大
3. 每一天的N城市到汇点T连边,容量为正无穷大
4. 源点V与第0天的所有顶点连边,容量为当前城市0天初始人数
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<string>
#include<queue>
#include<vector>
using namespace std;
const int M = ;
const int inf = 0x3f3f3f3f;
int n, d, m, tot;
struct Fight{
int u, v;
int c, p, e;
void input(){
scanf("%d%d%d%d%d",&u,&v,&c,&p,&e);
}
}fight[M];
int people[];
int S, T, N;
struct Edge{
int v, f, nxt;
}edge[];
int head[], idx; void AddEdge(int u,int v,int f){
edge[idx].v = v, edge[idx].f = f;
edge[idx].nxt = head[u], head[u] = idx++;
edge[idx].v = u, edge[idx].f = ;
edge[idx].nxt = head[v], head[v] = idx++;
}
void CreateGraph(int Max){
//init
idx = ;
memset( head, -, sizeof(head));
S = , T = (d+)*n+, N = (d+)*n+;
int u, v, c, p, e;
for(int i = ; i < m; i++){
u = fight[i].u, v = fight[i].v, c = fight[i].c, p = fight[i].p, e = fight[i].e;
if( p <= Max ) AddEdge( e*n+u, (e+)*n+v, c );
}
for(int i = ; i <= n; i++ )
AddEdge( S, i, people[i] );
for(int d1 = ; d1 < d; d1++ ){
for(int i = ; i <= n; i++ )
AddEdge( d1*n+i, (d1+)*n+i, inf );
}
for(int d1 = ; d1 <= d; d1++ )
AddEdge( d1*n+n, T, inf );
}
int h[], vh[]; int dfs(int u, int flow ){
if( u == T ) return flow;
int t = h[u]+, sum = flow;
for(int i = head[u]; ~i; i = edge[i].nxt ){
int v = edge[i].v;
if( edge[i].f && (h[v]+==h[u]) ){
int tmp = dfs( v, min(sum,edge[i].f) );
edge[i].f -= tmp, edge[i^].f += tmp; sum -= tmp;
if( sum == || h[S] == N ) return flow-sum;
}
}
for(int i = head[u]; ~i; i = edge[i].nxt )
if( edge[i].f ) t = min( t, h[ edge[i].v ] );
if( --vh[ h[u] ] == ) h[S] = N;
else ++vh[ h[u] = t+ ];
return flow - sum;
}
int sap(){
int maxflow = ;
memset( h, , sizeof(h));
memset( vh, , sizeof(vh));
vh[] = N;
while( h[S] < N ) maxflow += dfs( S, inf );
return maxflow;
}
int solve(){
int ans = -;
int l = , r = ;
while( l <= r ){
int mid = (l+r)>>;
CreateGraph( mid );
int tmp = sap(); //printf("tmp = %d\n", tmp);
if( tmp >= tot ) ans = mid, r = mid-;
else l = mid+;
}
return ans;
}
int main(){
int _;
scanf("%d",&_);
for(int Case = ; Case <= _; Case++){
scanf("%d%d%d",&n,&d,&m);
int u, v, c, p, e;
for(int i = ; i < m; i++)
fight[i].input();
tot = ;
for(int i = ; i <= n; i++){
scanf("%d", &people[i] );
tot += people[i];
}
int ans = solve();
printf("Case #%d: ", Case );
if( ans == - ) puts("Impossible");
else printf("%d\n", ans );
}
return ;
}
uva 10983 Buy one, get the rest free 二分判定层次图的更多相关文章
- UVa 1151 - Buy or Build(最小生成树)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA 1151 Buy or Build MST(最小生成树)
题意: 在平面上有n个点,要让所有n个点都连通,所以你要构造一些边来连通他们,连通的费用等于两个端点的欧几里得距离的平方.另外还有q个套餐,可以购买,如果你购买了第i个套餐,该套餐中的所有结点将变得相 ...
- UVA 1151 Buy or Build (最小生成树)
先求出原图的最小生成树,然后枚举买哪些套餐,把一个套餐内的点相互之间边权为0,直接用并查集缩点.正确性是基于一个贪心, 在做Kruskal算法是,对于没有进入最小生成树的边,排序在它前面的边不会减少. ...
- UVA 1151 Buy or Build (MST最小生成树,kruscal,变形)
题意: 要使n个点之间能够互通,要使两点直接互通需要耗费它们之间的欧几里得距离的平方大小的花费,这说明每两个点都可以使其互通.接着有q个套餐可以选,一旦选了这些套餐,他们所包含的点自动就连起来了,所需 ...
- uva 1151 - Buy or Build poj 2784 Buy or Build(最小生成树)
最小生成树算法简单 只是增加了一些新的东西,对于需要最小生成树算法 和中 并检查使用的一系列 还有一些更深入的了解. 方法的一些复杂问题 #include<cstdio> #include ...
- UVa 1151 Buy or Build (最小生成树+二进制法暴力求解)
题意:给定n个点,你的任务是让它们都连通.你可以新建一些边,费用等于两点距离的平方(当然越小越好),另外还有几种“套餐”,可以购买,你购买的话,那么有些边就可以连接起来, 每个“套餐”,也是要花费的, ...
- UVa 1151 Buy or Build【最小生成树】
题意:给出n个点的坐标,现在需要让这n个点连通,可以直接在点与点之间连边,花费为两点之间欧几里得距离的平方,也可以选购套餐,套餐中所含的点是相互连通的 问最少的花费 首先想kruskal算法中,被加入 ...
- UVA - 1151 Buy or Build (买还是建)(并查集+二进制枚举子集)
题意:平面上有n个点(1<=n<=1000),你的任务是让所有n个点连通.可以新建边,费用等于两端点欧几里德距离的平方.也可以购买套餐(套餐中的点全部连通).问最小费用. 分析: 1.先将 ...
- POJ2828 Buy Tickets [树状数组,二分答案]
题目传送门 Buy Tickets Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 22611 Accepted: 110 ...
随机推荐
- 用python将MSCOCO和Caltech行人检测数据集转化成VOC格式
代码:转换用的代码放在这里 之前用Tensorflow提供的object detection API可以很方便的进行fine-tuning实现所需的特定物体检测模型(看这里).那么现在的主要问题就是数 ...
- opencv3.2将中文输出到图片上
opencv自带的putText函数无法输出utf8类型的字符,因此无法将中文打印到图片上.用这篇文章的freetype可以实现中文输出,但是需要将字符解码转码比较麻烦,而Pillow的Image函数 ...
- ispriter自动构建css-sprite
优化你的网站: 当一个网站中的资源(比如:js文件.css文件.图片等)很多时必然影响用户访问速度,这时候你就需要做网站性能优化,你可以选择把资源分开放在不同的服务器上,因为一个资源服务器最多可以同时 ...
- _DataStructure_C_Impl:图的邻接矩阵存储
//_DataStructure_C_Impl:邻接矩阵 #include<stdio.h> #include<stdlib.h> #include<string.h&g ...
- Git Step by Step – (1) Git 简介
由于工作的需要,代码版本控制工具要从Perforce换成Git.说实话,刚开始真的很不适应,要从一个可以很好的支持用户界面的工具转到一个命令行工具,而且Git中有几百个命令,一下子就傻眼了. 但是经过 ...
- CentOS6.8_64位手动安装MySQL5.6
1.在CentOS6.8上安装mysql5.6 2.下载编译包 wget https://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.35-linu ...
- 【代码审计】XIAOCMS_存在任意文件删除漏洞分析
0x00 环境准备 XIAOCMS官网: http://www.xiaocms.com/ 网站源码版本:XiaoCms (发布时间:2014-12-29) 程序源码下载:http://www.xi ...
- vs 2010中如何检查内存泄露
首先,在文件头添加下面的内容: #ifdef _DEBUG#define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__)#else# ...
- Windows内存放血篇,突破物理内存的CopyOnWrite
本篇以x86(开启PAE) 以及x64 Win7系统 不借助微软API突破内存的写拷贝机制进行讲述 https://bbs.pediy.com/thread-222949.htm 0x01 B ...
- Jquery 网页转换为图片
/* html2canvas 0.5.0-alpha1 <http://html2canvas.hertzen.com> Copyright (c) 2015 Niklas von Her ...