http://poj.org/problem?id=2391

floyd+网络流+二分

题意:有一个有向图,里面每个点有ai头牛,快下雨了牛要躲进雨棚里,每个点有bi个雨棚,每个雨棚只能躲1头牛。牛可以通过点之间的边移动来躲到其他的点的雨棚,路很宽一次可以走无数头牛,路的权是牛走过这条路要的时间。求最短需要多少时间所有牛都躲到雨棚下。

题解:

先floyd求出每个点到每个点的最短时间!然后二分答案,也就是二分牛躲完的时间,然后大于这个时间的路都封了,建个碉图,每个点分成两个点A和B,起点连接到所有的A,流量为牛数,所有的点B连接到终点,流量为棚数,一些A连接到一些B,流量为无限,代表牛的移动。二分+网络流,啪啪啪就过了。这是我做的第一个二分+网络流的题,好激动口牙!

 #include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
const long long inf=0x7fffffffffffLL;
const int MAXN=;
long long a[MAXN][MAXN];
long long b[MAXN][MAXN];
long long d[MAXN][MAXN];
int m,n;
ll c[MAXN][MAXN];
ll D[MAXN],h[MAXN],g[MAXN];
bool found;
ll augc,flow;
int st,ed,N;
ll sum; void floyd()
{
int i,j,k;
memcpy(d,b,sizeof(b));
for(k=;k<=n;k++)
for(i=;i<=n;i++)
for(j=;j<=n;j++)
if(d[i][k]+d[k][j]<d[i][j])
d[i][j]=d[i][k]+d[k][j];
} void aug(const int m)
{
int i,augco=augc,mini,minh=N-;
if (m==ed)//如果当前结点为汇点
{
found=true;
flow+=augc; //增加流量
return;
}
for (i=D[m]; i<=N; i++)//寻找容许边
if (c[m][i]> && h[i]+==h[m])//如果残留容量大于0,如果是容许边
{
if (c[m][i]<augc) augc=c[m][i];//如果容许边流量小于当前增广路流量 则更新增广路流量
D[m]=i; //把i定为当前弧
aug(i); //递归
if (h[]>=N) return; //GAP 如果源点距离标号大于n 则停止算法
if (found) break; //如果找到汇点 则退出寻找
augc=augco;//没找到就还原当前的流
}
if (!found) //重标号
{
for (i=; i<=N; i++) //找那个标号,这里不能用d[m]开始,不然会蛋疼
if (c[m][i]> && h[i]<minh)
{
minh=h[i];
mini=i;
}
g[h[m]]--; //GAP 距离为
if (g[h[m]]==) h[]=N; //GAP
h[m]=minh+;
D[m]=mini;
g[h[m]]++; //GAP
}
else
{//修改残量
c[m][i]-=augc;
c[i][m]+=augc;
}
} bool farm(ll time)
{
int i,j;
//cout<<"farm"<<time<<endl;
memcpy(c, a, sizeof(a));
for(i=;i<=n;i++)
for(j=;j<=n;j++)
if(d[i][j]<=time) c[i+][j++n]=inf;
else c[i+][j++n]=;
N=ed;
// for(i=1;i<=N;i++)
// {
// for(j=1;j<=N;j++)
// cout<<c[i][j]<<' ';
// cout<<endl;
// }
memset(h,,sizeof(h));
memset(g,,sizeof(g));
g[]=N;
flow=;
for(i=; i<=N; i++)
D[i]=;//当前弧初始化
while(h[]<N)
{
augc=inf;//初始化增广路容量为正无穷大
found=false;
aug();//从源点开始找
}
if(flow==sum) return true;
else return false;
} int main()
{
int i,j,k;
ll x,y,z;
while(scanf("%d%d",&n,&m)!=EOF)
{
sum=;
memset(a,,sizeof(a));
st=;ed=n+n+;
for(i=;i<=n+;i++)
{
scanf("%lld%lld",&x,&y);
sum+=x;
a[][i]+=x;
a[i+n][ed]+=y;
}
for(i=;i<=n;i++)
for(j=;j<=n;j++)
b[i][j]=inf;
for(i=;i<=n;i++)
b[i][i]=;
for(i=;i<=m;i++)
{
scanf("%lld%lld%lld",&x,&y,&z);
b[x][y]=min(b[x][y],z);
b[y][x]=b[x][y];
}
floyd();
ll l=inf,r=-;
for(i=;i<=n;i++)
for(j=;j<=n;j++)
{
l=min(l,d[i][j]);
r=max(r,d[i][j]);
}
r=min(inf-,r);
if (!farm(r))
{
printf("-1\n");
continue;
}
ll mid=(l+r)/,pl=-,pr=-;
while(l!=pl || r!=pr)
{
pl=l;pr=r;
if(farm(mid)) r=mid;
else l=mid;
mid=(l+r)/;
//cout<<l<<','<<r<<','<<mid<<endl;
}
printf("%lld\n",r);
}
return ;
}

poj2391 Ombrophobic Bovines 题解的更多相关文章

  1. poj2391 Ombrophobic Bovines 拆点+二分法+最大流

    /** 题目:poj2391 Ombrophobic Bovines 链接:http://poj.org/problem?id=2391 题意:有n块区域,第i块区域有ai头奶牛,以及一个可以容纳bi ...

  2. POJ2391 Ombrophobic Bovines(网络流)(拆点)

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

  3. POJ2391 Ombrophobic Bovines

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

  4. POJ2391 Ombrophobic Bovines 网络流拆点+二分+floyed

    题目链接: id=2391">poj2391 题意: 有n块草地,每块草地上有一定数量的奶牛和一个雨棚,并给出了每一个雨棚的容(牛)量. 有m条路径连接这些草地  ,这些路径是双向的, ...

  5. POJ2391:Ombrophobic Bovines(最大流+Floyd+二分)

    Ombrophobic Bovines Time Limit: 1000MSMemory Limit: 65536K Total Submissions: 21660Accepted: 4658 题目 ...

  6. BZOJ 1738: [Usaco2005 mar]Ombrophobic Bovines 发抖的牛( floyd + 二分答案 + 最大流 )

    一道水题WA了这么多次真是.... 统考终于完 ( 挂 ) 了...可以好好写题了... 先floyd跑出各个点的最短路 , 然后二分答案 m , 再建图. 每个 farm 拆成一个 cow 点和一个 ...

  7. poj 2391 Ombrophobic Bovines, 最大流, 拆点, 二分, dinic, isap

    poj 2391 Ombrophobic Bovines, 最大流, 拆点, 二分 dinic /* * Author: yew1eb * Created Time: 2014年10月31日 星期五 ...

  8. POJ 2391 Ombrophobic Bovines

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

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

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

随机推荐

  1. CSS3伪类选择器:nth-child()(nth-child(odd)/nth-child(even))

    nth-child(odd):奇数 nth-child(even):偶数 使用时,如果是精确到数字时,切记是从同一级别的元素开始计算,而不是指定某个类才开始计算. 比如: <li>< ...

  2. Android成长日记-WebView使用

    在App中有时候会看到一些页面是以网页的形式展示,其原理就是运用了WebView,下面予以讲述WebView 1. 使用Intent调用系统浏览器或者第三方浏览器打开网页 调用系统浏览器打开页面 Ur ...

  3. crawler: 常用的一些工具

    phantomjs, Headless的WebKit Driver,意味着可以无需GUI,完全模拟Chrome/Safari的操作. casperjs(基于phantomjs的好用封装),zombie ...

  4. CentOS找回root密码

    如果忘记了root密码,可以进入单用户模式进行密码重置. 重启系统,在grub的启动菜单中按下e键,然后编辑kernel那一行,在最后的quiet后加上single. 按下Enter后,再按b开机进入 ...

  5. C++ 第二次课堂作业(反转链表)

    题目链接: 传送门 GitHub链接: 传送门

  6. 第二次作业——C++学习

    课程选择: 以往在自学的过程就比较留意一些自学的网站,所以这次"C++自学"感觉找课程还是比较轻松的. 因为之前网页等学习都是在慕课网(视频学习个人感觉有时挺费时间的,特别是有时以 ...

  7. 对JavaScript优化及规范的一些感想

    变量...... 1.一个变量只存一种类型的数据,2.尽量减少对隐式转换的依赖,这样可增强程序的可读性,日后修改程序时不至于混乱,3.使用匈牙利命名法,4.使用局部变量时记得加 var 进行声明,不然 ...

  8. chrome断点调试

    chrome断点调试 在编写JavaScript代码时,如果出现了bug,就要不断的去找错误,如果console控制台中提示还好说,可是没有提示恐怕就要费一番周折了.但是有了chrome这个浏览器,我 ...

  9. Docker入门教程(五)Docker安全

    Docker入门教程(五)Docker安全 [编者的话]DockOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第五篇,介绍了Docker的安全问题,依然是老话重谈,入门者可以通 ...

  10. JS-流程控制汇集

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>流 ...