传送门

发现惊天大错误QAQ

T上天然后发现自己的板子是假的QAQ

就是这一句

if(!cur)  return flow;

我之前一直写的是break。。。

注意实际意义

我们的dep[x]=-1是当前已经流不满无法増广了所以才把它设为-1不再增广

而流满了表示还可以继续增广所以直接return

我以前一直写的假板子直到这个题T飞。。。一个爆哭。。。

回归正传

这个题我们需要求最小化跑的最远的奶牛的时间

由此可以想到二分

二分以后我们需要找到最远的奶牛,可以通过预处理出两两牛棚的最短路来进行连边

所以最后的图大概是这个样子

对于每一个田地拆成两个点 初始牛和牛棚

源点连牛流量为牛的数量 牛棚连汇点流量为牛棚的容量 对于二分的mid 我们对dis[i][j]<=mid的连边流量为inf

然后看最后是否能满流就可以啦

二分+判断满流也是一个常见套路呢(另外一个是枚举+残存网络加边)

附代码。(注意longlong又一个爆哭)

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define inf 1000000000000ll
#define ll long long
using namespace std;struct edge{int to,lt;ll f;}e[320010],p[3010];
int in[420],cnt,s,t,n,m,ip[420];
queue<int> que;ll dis[420][420],dep[420],tot;
void addpath(int x,int y,ll f)
{p[++cnt].to=y;p[cnt].lt=ip[x];p[cnt].f=f;ip[x]=cnt;p[++cnt].to=x;p[cnt].lt=ip[y];p[cnt].f=f;ip[y]=cnt;
}
void add(int x,int y,ll f)
{e[++cnt].to=y;e[cnt].lt=in[x];e[cnt].f=f;in[x]=cnt;e[++cnt].to=x;e[cnt].lt=in[y];e[cnt].f=0;in[y]=cnt;
}
void floyd()
{memset(dis,48,sizeof(dis));//printf("%lld\n",dis[0][0]);for(int i=1;i<=n;i++) dis[i][i]=0;for(int i=1;i<=n;i++)for(int j=ip[i];j;j=p[j].lt)dis[i][p[j].to]=min(dis[i][p[j].to],p[j].f);for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
bool bfs()
{while(!que.empty())    que.pop();memset(dep,0,sizeof(dep));dep[s]=1;que.push(s);while(!que.empty()){int x=que.front();que.pop();//printf("%d %d\n",x,in[x]);printf("QAQ");for(int i=in[x];i;i=e[i].lt){int y=e[i].to;if(!dep[y]&&e[i].f){dep[y]=dep[x]+1;if(y==t) return 1;que.push(y);}}}return 0;
}
ll dfs(int x,ll flow)
{if(x==t||!flow)  return flow;ll cur=flow;for(int i=in[x];i;i=e[i].lt){int y=e[i].to;if(dep[y]==dep[x]+1&&e[i].f){ll tmp=dfs(y,min(cur,e[i].f));e[i].f-=tmp;e[i^1].f+=tmp;cur-=tmp;if(!cur)   return flow;}}dep[x]=-1;return flow-cur;
}
ll dinic()
{ll ans=0;while(bfs()) ans+=dfs(s,inf);//printf("%d\n",ans);return ans;
}
int cow[400],she[400];
bool check(ll tmp)
{cnt=1;memset(in,0,sizeof(in));for(int i=1;i<=n;i++)for(int j=1;j<=n;j ++)if(dis[i][j]<=tmp) add(i,n+j,inf);for(int i=1;i<=n;i++)    add(s,i,cow[i]),add(n+i,t,she[i]);ll cur=dinic();//printf("%lld %lld\n",tmp,cur);return cur==tot;
}
ll erf()
{ll l=0,r=inf,mid,ans=inf;while(l<=r){mid=(l+r)>>1;//printf("%lld\n",mid);if(check(mid))   ans=mid,r=mid-1;else  l=mid+1;}return ans;
}
int main()
{//int n,m;scanf("%d%d",&n,&m);s=2*n+1;t=s+1;for(int i=1;i<=n;i++) scanf("%d%d",&cow[i],&she[i]),tot+=cow[i];for(int i=1;i<=m;i++){int x,y;ll f;scanf("%d%d%lld",&x,&y,&f);addpath(x,y,f);}floyd();ll ans=erf();printf("%lld\n",ans==inf?-1:ans);return 0;
}

转载于:https://www.cnblogs.com/hanyuweining/p/10321952.html

POJ2391 Ombrophobic Bovines相关推荐

  1. POJ-2391 Ombrophobic Bovines 网络流-拆点构图

    题意:有F快草地,每块草地上有若干奶牛也有避雨点,每个避雨点只能够容纳一定量的奶牛.草地之间有边.现在问所有牛全部到达避雨点的时间是多少? 解法:这题和POJ-2112非常相似,做法也差不多,foly ...

  2. poj2391 Ombrophobic Bovines 拆点连边要注意

    [题意]:给定F个牛棚和P条路径,每条路径有一个长度,现在每个牛棚有一定的容量和牛数,因为牛棚牛数可能大于容量,所以要牛棚之间的牛要进行相互地移动,每移动一个距离就花费一单位的时间,求从开始移动到每头 ...

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

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

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

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

  5. POJ 2391 Ombrophobic Bovines 网络流 建模

    [题目大意] 给定一个无向图,点i处有Ai头牛,点i处的牛棚能容纳Bi头牛,求一个最短时间T使得在T时间内所有的牛都能进到某一牛棚里去.(1 <= N <= 200, 1 <= M ...

  6. 【bzoj1738】[Usaco2005 mar]Ombrophobic Bovines 发抖的牛 Floyd+二分+网络流最大流

    题目描述 FJ's cows really hate getting wet so much that the mere thought of getting caught in the rain m ...

  7. [颓废史]蒟蒻的刷题记录

    QAQ蒟蒻一枚,其实我就是来提供水题库的. 以下记录从2016年开始. 1.1 1227: [SDOI2009]虔诚的墓主人 树状数组+离散化 3132: 上帝造题的七分钟 树状数组 二维区间加减+查 ...

  8. 【HDOJ图论题集】【转】

    1 =============================以下是最小生成树+并查集====================================== 2 [HDU] 3 1213 How ...

  9. 一系列图论问题[转]

    =============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...

最新文章

  1. 单片机while用法c语言例子,51单片机-C语言之while(!x)的理解
  2. android 界面切换【转】
  3. iscsi 同步_群晖六盘位旗舰NAS,一文教你如何解决多设备同步,跨平台协调
  4. 哥德巴赫猜想(信息学奥赛一本通-T1157)
  5. 深交所与工信部签署优质中小企业上市培育战略合作协议
  6. linux ipv4 keepalive,Linux中keepalive的使用
  7. 服务器维修解锁,云服务器解锁
  8. c 程序设计语言第一次作业,重大2017年C++程序设计语言第一次作业(含答案).doc...
  9. HDOJ 1025 DP
  10. Cryengine渲染引擎剖析(转)
  11. 应用程序开发选择工具应注重运行效率还是易用性
  12. 两个路由器如何通过一根网线组建局域网(非wifi桥接方式)
  13. 20145213《Java程序设计》第五周学习总结
  14. 如何快速求出与n互素的数有多少个?
  15. 基于Dockerfile制作镜像
  16. 音乐节为什么需要网络覆盖?如何搭建临时稳定WiFi?
  17. the android sdk location cannot be at the filesystem root.的解决方案
  18. Devexpress中统一设置字体样式的方法
  19. WIN7 XP设置MTU,提升下载速度
  20. 如何进行视频抠像?视频抠像一键搞定

热门文章

  1. HTTP CORS(HTTP-同源策略)
  2. 汇编语言---判断字符
  3. idea安装Translation翻译插件
  4. 高带宽低性能服务器,国外大带宽低延迟服务器首选天下数据美国服务器
  5. oraclr 和mysql的不同_Mysql和Oracle中的不同
  6. Java服务端向客户端写文件_java实现客户端向服务器发送文件
  7. spring实现事务原理
  8. ESRI ArcGIS 9.0系列软件报价(转)
  9. JavaScript求两点之间相对于Y轴的顺时针旋转角度
  10. 排序算法的总结——Java实现