有F个地方,每个地方有一定数量的牛,能够容纳一定数量的牛,某些地方之间有边,表示走两点之间需要消耗的时间。

现在求使得所有的牛都被容纳所需要的最少的时间。

由于时间是一个不确定的因素,我们需要二分。

假设当前二分的时间为t,那么从某一点出发距离不要超过t的点都是可以连边的,于是最后只需要跑最大流验证是否满流即可。

此题给的数据居然爆int,真是深坑啊。

召唤代码君:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#define maxn 1122
#define maxm 555555
typedef long long ll;
using namespace std; ll inf=~0U>>;
ll to[maxm],next[maxm],c[maxm],first[maxn],edge;
ll cow[maxn],hold[maxn],d[maxn],tag[maxn],TAG=;
ll Q[maxm],bot,top;
ll dis[maxn][maxn],f[maxn],g[maxn][maxn];
bool can[maxn];
ll n,m,sumcow,ans,s,t; void _init()
{
sumcow=;
for (int i=; i<=n; i++)
for (int j=; j<=n; j++) dis[i][j]=-;
} void spfa(ll x)
{
for (int i=; i<=n; i++) f[i]=inf;
Q[bot=top=]=x,f[x]=;
while (bot<=top)
{
ll cur=Q[bot++];
for (int i=; i<=n; i++)
if (dis[cur][i]!=- && f[cur]+dis[cur][i]<f[i])
{
Q[++top]=i;
f[i]=f[cur]+dis[cur][i];
}
}
for (int i=; i<=n; i++) g[x][i]=f[i];
} void _input()
{
ll U,V,W;
for (int i=; i<=n; i++) scanf("%I64d%I64d",&cow[i],&hold[i]),sumcow+=cow[i];
while (m--)
{
scanf("%I64d%I64d%I64d",&U,&V,&W);
if (dis[U][V]==-) dis[U][V]=dis[V][U]=W;
else if (W<dis[U][V]) dis[U][V]=dis[V][U]=W;
}
for (int i=; i<=n; i++) if (cow[i]>) spfa(i);
} void addedge(ll U,ll V,ll W)
{
edge++;
to[edge]=V,c[edge]=W,next[edge]=first[U],first[U]=edge;
edge++;
to[edge]=U,c[edge]=,next[edge]=first[V],first[V]=edge;
} bool bfs()
{
Q[bot=top=]=t,d[t]=,tag[t]=++TAG;
while (bot<=top)
{
ll cur=Q[bot++];
for (int i=first[cur]; i!=-; i=next[i])
{
if (c[i^]> && tag[to[i]]!=TAG)
{
tag[to[i]]=TAG,Q[++top]=to[i];
d[to[i]]=d[cur]+,can[to[i]]=false;
if (to[i]==s) return true;
}
}
}
return false;
} ll dfs(ll cur,ll num)
{
if (cur==t) return num;
ll tmp=num,k;
for (int i=first[cur]; i!=-; i=next[i])
if (c[i]> && d[to[i]]==d[cur]- && tag[to[i]]==TAG && !can[to[i]])
{
k=dfs(to[i],min(c[i],num));
if (k) num-=k,c[i]-=k,c[i^]+=k;
if (num==) break;
}
if (num) can[cur]=true;
return tmp-num;
} bool check(ll x)
{
s=,t=*n+,edge=-,ans=;
for (int i=s; i<=t; i++) first[i]=-;
for (int i=; i<=n; i++)
{
if (cow[i]>)
{
addedge(s,i,cow[i]);
for (int j=; j<=n; j++)
if (g[i][j]<=x) addedge(i,j+n,cow[i]);
}
addedge(i+n,t,hold[i]);
}
while (bfs()) ans+=dfs(s,inf);
return ans==sumcow;
} int main()
{
inf*=inf;
while (scanf("%I64d%I64d",&n,&m)!=EOF)
{
_init();
_input();
if (!check(inf-))
{
puts("-1");
continue;
}
ll l=,r=inf-,mid;
while (l<r)
{
mid=l/+r/;
if (l&r&) mid++;
if (check(mid)) r=mid;
else l=mid+;
}
printf("%I64d\n",l);
}
return ;
}

POJ2391_Ombrophobic Bovines的更多相关文章

  1. POJ 2391 Ombrophobic Bovines

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

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

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

  3. Ombrophobic Bovines 分类: POJ 图论 最短路 查找 2015-08-10 20:32 2人阅读 评论(0) 收藏

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

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

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

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

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

  6. POJ2391 Ombrophobic Bovines

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

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

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

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

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

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

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

随机推荐

  1. VRRP+tunnel+IP SLA+Track实现冗余切换

    IP SLA(Internet Protocol Service-Level Agreement)互联网服务等级协议,本实验里通过发送测试报文,测试下一跳是否可达,结合Track实现冗余静态路由的切换 ...

  2. Unity3D — —存读档【转载】

    详细可参考此篇博文: Unity序列化之XML,JSON--------合成与解析 简单例子(SiKi学院教程): using System.Collections; using System.Col ...

  3. 会了这十种Python优雅的写法,让你工作效率翻十倍,一人顶十人用!

      我们都知道,Python 的设计哲学是「优雅」.「明确」.「简单」.这也许很多人选择 Python 的原因.但是我收到有些伙伴反馈,他写的 Python 并不优雅,甚至很臃肿,那可能是你的姿势不对 ...

  4. k8s踩坑记第1篇--rc无法创建

    六一快乐!!! 什么是k8s,我不想解释,百度资料有很多,本系列只踩坑,不科普. 问题描述: 做Hello World的例子,结果get pods一直显示没有资源? 应用配置代码: apiVersio ...

  5. 从一个简单的寻路问题深入Q-learning

    这第一篇随笔实际上在我的科学网博客上是首发,我重新拿到博客园再发一次是希望以此作为我学习Q-learning的一个新的开始.以后这边主技术,科学网博客主理论.我也会将科学网那边技术类的文章转过来的.希 ...

  6. PSP Daily软件beta版本——基于NABCD评论,及改进建议

    1.根据(不限于)NABCD评论作品的选题: 此软件的用户人群较为明确,即:用户(软件工程课上学生)记录例行报告.写每周PSP表格和统计的需求.潜在用户还有未来该课堂的学生和需要用PSP方法记录任务完 ...

  7. Notes of Daily Scrum Meeting(11.17)

    Notes of Daily Scrum Meeting(11.17) 今天是第四周的周一,也就是说距离最后发布也只剩下一周的时间,但我们的工程里面还有很多的问题没有解决,我关注过 其他一两个小组,他 ...

  8. Sprint6

    进展:今天更改一下我们的计划,从实现主要功能开始,及闹钟和事件提醒部分.查看了一些有关闹钟部分的资料.

  9. ASP.NET中实现封装与策略模式

    首先把运算方法封装起来,这样在网页界面中直接就可以调用了,不过是换张脸而已! using System; using System.Collections.Generic; using System. ...

  10. Codeforces Round #157 (Div. 1) B. Little Elephant and Elections 数位dp+搜索

    题目链接: http://codeforces.com/problemset/problem/258/B B. Little Elephant and Elections time limit per ...