poj 2391 Ombrophobic Bovines, 最大流, 拆点, 二分, dinic, isap
最大流, 拆点, 二分
dinic
/*
* Author: yew1eb
* Created Time: 2014年10月31日 星期五 15时39分22秒
* File Name: poj2391.cpp
*/
#include <ctime>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
using namespace std;
typedef long long ll;
const int inf = 1e9;
const ll INF = 1e18;
const double eps = 1e-8;
const double pi = acos(-1.0);
const int maxn = 600;
const int maxm = 100000;
struct Edge{
int to, next;
int cap;
Edge(){}
Edge(int nt, int t, int cp):next(nt),to(t),cap(cp){}
}edge[maxm]; int head[maxn], tot;
int n, m, S, T; void init(){
tot = 0;
memset(head, -1, sizeof head );
} void add(int u, int v, int c){
edge[tot] = Edge(head[u], v, c); head[u] = tot++;
edge[tot] = Edge(head[v], u, 0); head[v] = tot++;
} int d[maxn];
bool vis[maxn]; bool bfs(){
queue<int> q;
q.push(S);
memset(vis, 0, sizeof vis );
vis[S] = 1; d[S] = 0;
while(!q.empty()){
int u = q.front(); q.pop();
for(int i=head[u]; ~i; i=edge[i].next){
int &v = edge[i].to;
if(!vis[v] && edge[i].cap>0){
vis[v] = 1;
d[v] = d[u] + 1;
q.push(v);
}
}
}
return vis[T];
} int dfs(int u, int a){
if(u==T||a==0) return a;
int flow = 0, f;
for(int i=head[u];~i; i=edge[i].next){
int &v = edge[i].to;
if(d[u]+1==d[v]&&(f=dfs(v,min(a,edge[i].cap)))>0){
edge[i].cap -= f;
edge[i^1].cap += f;
flow += f;
a -= f;
if(a==0) break;
}
}
return flow;
} int dinic(){
int flow = 0;
while(bfs()){
flow += dfs(S, inf);
}
return flow;
} ll g[maxn][maxn];
void floyd(){
for(int k=1; k<=n; ++k)
for(int i=1; i<=n; ++i)
for(int j=1; j<=n; ++j){
g[i][j] = min(g[i][j], g[i][k] + g[k][j]);
}
} int a[maxn], b[maxn];
void create_graph(ll x){
init();
for(int i=1; i<=n; ++i)
for(int j=1; j<=n; ++j)
if(g[i][j]<=x) add(i,j+n, inf);
for(int i=1; i<=n; ++i){
add(S, i, a[i]);
add(i+n, T, b[i]);
}
} int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
// freopen("out.cpp", "w", stdout);
#endif // ONLINE_JUDGE
scanf("%d%d", &n, &m);
int u, v, c;
S = 0, T = 2*n+2;
int sum = 0;
for(int i=1; i<=n; ++i){
scanf("%d%d", &a[i], &b[i]);
sum += a[i];
} for(int i=1; i<=n; ++i) {
g[i][i] = 0;
for(int j=i+1; j<=n; ++j)
g[i][j] = g[j][i] = INF;
}
for(int i=1; i<=m; ++i){
scanf("%d%d%d", &u, &v, &c);
if(g[u][v]>c) g[u][v] = g[v][u] = c;
}
floyd(); //bsearch
ll l = 0, r = 0, mid, ans = -1;
for(int i=1; i<=n; ++i) for(int j=1; j<=n; ++j)
if(g[i][j]<INF) r = max(r, g[i][j]);
while(l<=r){
mid = (l+r)>>1;
create_graph(mid);
int flow = dinic();
if(flow == sum){
ans = mid;
r = mid - 1;
}else
l = mid + 1;
}
cout<<ans<<endl;
return 0;
}
isap
int get_flow(int u, int flow)
{
if(u==T || flow==0)return flow;
int res=0, f;
for(int i=head[u]; ~i; i=edge[i].next) {
int &v = edge[i].to;
if(d[u]>d[v] && (f=get_flow(v,min(flow,edge[i].cap)))>0) {
edge[i].cap -= f;
edge[i^1].cap += f;
res += f;
flow -= f;
if(flow==0) return res;
}
}
if(!(--gap[d[u]]))d[S]=cnt+2;
gap[++d[u]]++;
return res;
} int isap()
{
int flow = 0;
memset(gap, 0, sizeof gap );
memset(d, 0, sizeof d );
cnt = T-S+1;//顶点数
gap[0] = cnt;
while(d[S]<cnt) flow += get_flow(S, inf);
return flow;
}
poj 2391 Ombrophobic Bovines, 最大流, 拆点, 二分, dinic, isap的更多相关文章
- poj 2391 Ombrophobic Bovines(最大流+floyd+二分)
Ombrophobic Bovines Time Limit: 1000MSMemory Limit: 65536K Total Submissions: 14519Accepted: 3170 De ...
- POJ 2391 Ombrophobic Bovines(Floyd+二分+最大流)
题目链接 题意:农场有F(1 <= F <= 200)片草地用于放牛,这些草地有P(1 <= P <= 1500)连接,农场的草地上有一些避雨点,奶牛们可以在避雨点避雨,但是避 ...
- POJ 2391 Ombrophobic Bovines
Ombrophobic Bovines Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 18623 Accepted: 4 ...
- POJ 2391 Ombrophobic Bovines (Floyd + Dinic +二分)
Ombrophobic Bovines Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11651 Accepted: 2 ...
- POJ 2391 Ombrophobic Bovines(二分+拆点+最大流)
http://poj.org/problem?id=2391 题意: 给定一个无向图,点i处有Ai头牛,点i处的牛棚能容纳Bi头牛,求一个最短时间T,使得在T时间内所有的牛都能进到某一牛棚里去. 思路 ...
- POJ 2391 Ombrophobic Bovines ★(Floyd+二分+拆点+最大流)
[题意]有n块草地,一些奶牛在草地上吃草,草地间有m条路,一些草地上有避雨点,每个避雨点能容纳的奶牛是有限的,给出通过每条路的时间,问最少需要多少时间能让所有奶牛进入一个避雨点. 和POJ2112很类 ...
- poj 2391 Ombrophobic Bovines 最短路 二分 最大流 拆点
题目链接 题意 有\(n\)个牛棚,每个牛棚初始有\(a_i\)头牛,最后能容纳\(b_i\)头牛.有\(m\)条道路,边权为走这段路所需花费的时间.问最少需要多少时间能让所有的牛都有牛棚可待? 思路 ...
- POJ 2391 Ombrophobic Bovines ( 经典最大流 && Floyd && 二分 && 拆点建图)
题意 : 给出一些牛棚,每个牛棚都原本都有一些牛但是每个牛棚可以容纳的牛都是有限的,现在给出一些路与路的花费和牛棚拥有的牛和可以容纳牛的数量,要求最短能在多少时间内使得每头牛都有安身的牛棚.( 这里注 ...
- POJ 2391.Ombrophobic Bovines (最大流)
实际上是求最短的避雨时间. 首先将每个点拆成两个,一个连接源点,一个连接汇点,连接源点的点的容量为当前单的奶牛数,连接汇点的点为能容纳的奶牛数. floyd求任意两点互相到达的最短时间,二分最长时间, ...
随机推荐
- List the Books
描述 Jim is fond of reading books, and he has so many books that sometimes it's hard for him to manage ...
- Redis 真得那么好用吗?
不管你是从事Python.Java.Go.PHP.Ruby等等......Redis都应该是一个比较熟悉的中间件.而大部分经常写业务代码的程序员,实际工作中或许只用到了set value.GetVal ...
- usaco-2.2.2Subset Sums 集合
01背包,对每个数至多取一次,为了避免重复,应倒序dp usaco-2.2.2Subset Sums 集合 时间限制: 1 Sec 内存限制: 128 MB 题目描述 对于从1到N的连续整集合合,能 ...
- MYSQL复习笔记5-select-from-where子句
Date: 20140125Auth: Jin参考:http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html#select一.select子句主要定 ...
- CentOS 6.9下KVM虚拟机网络Bridge(网桥)方式与NAT方式详解(转)
摘要:KVM虚拟机网络配置的两种方式:NAT方式和Bridge方式.Bridge方式的配置原理和步骤.Bridge方式适用于服务器主机的虚拟化.NAT方式适用于桌面主机的虚拟化. NAT的网络结构图: ...
- 安装Xampp-配置appche,mysql运行环境遇到的坑
用php编写的web应用程序,需运行在php的web容器中,其中apache server是一个针对php web容器,它是apache下的开源项目.通常要运行一个web程序,我们还需要安装数据库软件 ...
- NHibernate官方文档中文版--基础ORM(Basic O/R Mapping)
映射声明 对象/关系映射在XML文件中配置.mapping文件这样设计是为了使它可读性强并且可修改.mapping语言是以对象为中心,意味着mapping是围绕着持久化类声明来建立的,而不是围绕数据表 ...
- Android Studio导入第三方库的三种方法
叨叨在前 今天在项目中使用一个图片选择器的第三方框架——GalleryFinal,想要导入源码,以便于修改,于是上完查找了一下方法,想到之前用到过其他导入第三方库的方法,现在做个小总结,以防忘记. A ...
- [转]解决Eclipse更新ADT插件时遇到的Eclipse reports rendering library more recent than ADT plug-in问题
使用 SDK Manager 工具更新下载新版本后,无法显示可视化布局,同时提示 This version of the rendering library is more recent than y ...
- [Java基础] Java enum的用法详解
用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. p ...