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 ...
随机推荐
- jquery.form 和MVC4做无刷新上传DEMO
jquery.form 和MVC4做无刷新上传DEMO HTML: <script src="~/Scripts/jquery-1.10.2.min.js"></ ...
- swagger的说明、配置及使用
一.What is swagger? 官方介绍:Swagger是一个规范且完整的框架,提供描述.生产.消费和可视化RESTful Web Service.专业角度:Swagger是由庞大工具集合支撑的 ...
- 修复日志,阻止给日志多次添加handlers时候重复打印的问题
1.解决如果多次添加handlers重复打印的问题.在__add_handlers方法中作出判断. 2.由get_logger_and_add_handlers和get_logger_without_ ...
- [scala] scala 集合(⑧)
1.List 基础操作 2.Set 基础操作 3. TreeSet 排序Set 4. 拉链操作 5. 流 import scala.collection.immutable.TreeSet impor ...
- [Bayesian] “我是bayesian我怕谁”系列 - Exact Inference
要整理这部分内容,一开始我是拒绝的.欣赏贝叶斯的人本就不多,这部分过后恐怕就要成为“从入门到放弃”系列. 但,这部分是基础,不管是Professor Daphne Koller,还是统计学习经典,都有 ...
- winform 打开一个窗体,关闭一个窗体
例如 我要打开一个窗体b,关闭一个窗体a a中的代码添加: private void pictureBox5_Click(object sender, EventArgs e) { W_MainFo ...
- 【Oracle】两个表Join关联更新
两个表关联,用B表的字段更新A表的字段. UPDATE ( SELECT A.COL1 A_COL, B.COL2 B_COL FROM table1 A INNER JOIN table2 B ON ...
- com.alibaba.fastjson.JSONObject
package com.alibaba.fastjson; import java.util.Date; import java.util.List; import com.alibaba.fastj ...
- Java md5加密 控制台传入与web传入参数 结果不匹配 || 相同字符串加密结果不同,如何保证JAVA MD5加密结果在不同的环境下都相同
开发中遇到md5加密不一致问题,排除了上下文编码,加密内容问题. 爬了各类资料,最终找到了原因. /** 对字符串进行MD5加密 */ private static String encodeByMD ...
- c 各种编译器(gcc clang)
很多时候,出现一些类似GNU,GCC,CLANG,LLVM等与编译器有关的名词的时候,都不太清楚它到底是干嘛的,理解这些东西后, 对于xcode中很多配置型的需求修改起来都会得心应手,因此有必要了解透 ...