poj 2391 Ombrophobic Bovines,

最大流, 拆点, 二分

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的更多相关文章

  1. poj 2391 Ombrophobic Bovines(最大流+floyd+二分)

    Ombrophobic Bovines Time Limit: 1000MSMemory Limit: 65536K Total Submissions: 14519Accepted: 3170 De ...

  2. POJ 2391 Ombrophobic Bovines(Floyd+二分+最大流)

    题目链接 题意:农场有F(1 <= F <= 200)片草地用于放牛,这些草地有P(1 <= P <= 1500)连接,农场的草地上有一些避雨点,奶牛们可以在避雨点避雨,但是避 ...

  3. POJ 2391 Ombrophobic Bovines

    Ombrophobic Bovines Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18623   Accepted: 4 ...

  4. POJ 2391 Ombrophobic Bovines (Floyd + Dinic +二分)

    Ombrophobic Bovines Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11651   Accepted: 2 ...

  5. POJ 2391 Ombrophobic Bovines(二分+拆点+最大流)

    http://poj.org/problem?id=2391 题意: 给定一个无向图,点i处有Ai头牛,点i处的牛棚能容纳Bi头牛,求一个最短时间T,使得在T时间内所有的牛都能进到某一牛棚里去. 思路 ...

  6. POJ 2391 Ombrophobic Bovines ★(Floyd+二分+拆点+最大流)

    [题意]有n块草地,一些奶牛在草地上吃草,草地间有m条路,一些草地上有避雨点,每个避雨点能容纳的奶牛是有限的,给出通过每条路的时间,问最少需要多少时间能让所有奶牛进入一个避雨点. 和POJ2112很类 ...

  7. poj 2391 Ombrophobic Bovines 最短路 二分 最大流 拆点

    题目链接 题意 有\(n\)个牛棚,每个牛棚初始有\(a_i\)头牛,最后能容纳\(b_i\)头牛.有\(m\)条道路,边权为走这段路所需花费的时间.问最少需要多少时间能让所有的牛都有牛棚可待? 思路 ...

  8. POJ 2391 Ombrophobic Bovines ( 经典最大流 && Floyd && 二分 && 拆点建图)

    题意 : 给出一些牛棚,每个牛棚都原本都有一些牛但是每个牛棚可以容纳的牛都是有限的,现在给出一些路与路的花费和牛棚拥有的牛和可以容纳牛的数量,要求最短能在多少时间内使得每头牛都有安身的牛棚.( 这里注 ...

  9. POJ 2391.Ombrophobic Bovines (最大流)

    实际上是求最短的避雨时间. 首先将每个点拆成两个,一个连接源点,一个连接汇点,连接源点的点的容量为当前单的奶牛数,连接汇点的点为能容纳的奶牛数. floyd求任意两点互相到达的最短时间,二分最长时间, ...

随机推荐

  1. mqtt 协议之 PINGREQ, PINGRESP

    mqtt 协议里最简单的是 ping 协议吧 (心跳包), ping 协议是已连接的客户端发往服务端, 告诉服务端,我还"活着" PINGREQ - PING request fi ...

  2. 各种GCC

    Cross GCC Cygwin GCC Linux GCC MacOSX GCC MinGW GCC Solaris GCC Clang

  3. Docker从12升级到17ce

    先卸载 yum remove docker* yum remove container-selinux--.el7.centos.x86_64 安装 sudo yum install -y yum-u ...

  4. Windows DiskPart工具使用

    启动工具 diskpart 列出磁盘列表 list disk 选择磁盘 select disk 1 转换为GPT分区 convert gpt 列出分区 list partition 清除所有分区 cl ...

  5. XSS之浪潮已经来临

    前些天和Roy厉在微博上聊到微信公众账号,我说我在辛苦运营“网站安全中心”这个账号呢,他说我这账号粉丝少是少了点,不过用户定位精确,我说我不希望精确,因为我在尽可能写科普,科普需要传播. Roy厉说过 ...

  6. unity statics window fps原理

    https://forum.unity.com/threads/is-unity-fps-count-wrong-or-am-i-missing-something.150139/ 看了下这个fps ...

  7. socket网络编程基础小记

    "一切皆Socket!" 话虽些许夸张.可是事实也是,如今的网络编程差点儿都是用的socket. --有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间怎样通 ...

  8. Android开发之使用VideoView播放视频

    Android提供了 VideoView组件.它的作用与ImageView类似,仅仅是ImageView用于显示图片.而VideoView用于播放视频. 使用VideoView播放视频的过程例如以下: ...

  9. maven镜像制作

    故事背景: 需要在客户现场部署测试demo,由于部署环境不提供外网环境,应用所需依赖无法通过外网下载. 初步的解决方案,在本地起一个maven的容器,将代码copy到maven的容器内,进行打包操作, ...

  10. Android 珍藏(三)

    1.Android判断是Pad或者手机 public boolean isTabletDevice() { TelephonyManager telephony = (TelephonyManager ...