Description

约翰的牛们非常害怕淋雨,那会使他们瑟瑟发抖.他们打算安装一个下雨报警器,并且安排了一个撤退计划.他们需要计算最少的让所有牛进入雨棚的时间.    牛们在农场的F(1≤F≤200)个田地上吃草.有P(1≤P≤1500)条双向路连接着这些田地.路很宽,无限量的牛可以通过.田地上有雨棚,雨棚有一定的容量,牛们可以瞬间从这块田地进入这块田地上的雨棚    请计算最少的时间,让每只牛都进入雨棚.

Input

第1行:两个整数F和P;

第2到F+1行:第i+l行有两个整数描述第i个田地,第一个表示田地上的牛数,第二个表示田地上的雨棚容量.两个整数都在0和1000之间.

第F+2到F+P+I行:每行三个整数描述一条路,分别是起点终点,及通过这条路所需的时间(在1和10^9之间).

Output

一个整数,表示最少的时间.如果无法使牛们全部进入雨棚,输出-1.

题解:

首先floyd处理出点到点之间的最短时间,然后二分一个时间,网络流判断是否全部进入雨棚。

代码:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include<queue>
  5. // by zrt
  6. // problem:
  7. // 无论你在什么时候开始,重要的是开始以后就不要停止。
  8. using namespace std ;
  9. typedef long long LL ;
  10. const double eps(1e-10) ;
  11. const int inf(0x3f3f3f3f) ;
  12. int f,p;
  13. LL INF=0x3f3f3f3f3f3f3f3f;
  14. int ni[205],fi[205];
  15. LL map[205][205];
  16. int S,T;
  17. int H[404],X[340000],P[340000],tot;
  18. int flow[340000];
  19. int d[406];
  20. queue<int> q;
  21. bool bfs(){
  22. memset(d,0,sizeof d);
  23. d[S]=1;q.push(S);
  24. while(!q.empty()){
  25. int x=q.front();q.pop();
  26. for(int i=H[x];i;i=X[i]){
  27. if(flow[i]>0&&!d[P[i]]){
  28. d[P[i]]=d[x]+1;
  29. q.push(P[i]);
  30. }
  31. }
  32. }
  33. return d[T];
  34. }
  35. int dfs(int x,int a){
  36. int f=a,tmp;
  37. if(x==T||a==0) return a;
  38. for(int i=H[x];i;i=X[i]){
  39. if(flow[i]>0&&d[P[i]]==d[x]+1){
  40. tmp=dfs(P[i],min(a,flow[i]));
  41. a-=tmp;
  42. flow[i]-=tmp;
  43. flow[i^1]+=tmp;
  44. if(!a) break;
  45. }
  46. }
  47. if(f==a) d[x]=-1;
  48. // printf("%d\n",f-a);
  49. return f-a;
  50. }
  51. int Dinic(){
  52. int f=0;
  53. while(bfs()) f+=dfs(S,inf);
  54. return f;
  55. }
  56. inline void add(int x,int y,int z){
  57. P[++tot]=y;X[tot]=H[x];H[x]=tot;flow[tot]=z;
  58. }
  59. int sum=0;
  60. bool judge(LL lim){
  61. tot=1;memset(H,0,sizeof H);
  62. for(int i=1;i<=f;i++){
  63. add(S,i<<1,ni[i]);
  64. add(i<<1,S,0);
  65. add(i<<1,i<<1|1,inf);
  66. add(i<<1|1,i<<1,0);
  67. add(i<<1|1,T,fi[i]);
  68. add(T,i<<1|1,0);
  69. }
  70. for(int i=1;i<=f;i++){
  71. for(int j=1;j<=f;j++){
  72. if(i!=j) {
  73. if(map[i][j]<=lim){
  74. add(i<<1,j<<1|1,inf);
  75. add(j<<1|1,i<<1,0);
  76. }
  77. }
  78. }
  79. }
  80. if(Dinic()==sum) return true;
  81. else return false;
  82. }
  83. int main(){
  84. #ifdef LOCAL
  85. freopen("in.txt","r",stdin) ;
  86. freopen("out.txt","w",stdout) ;
  87. #endif
  88. scanf("%d%d",&f,&p);
  89. S=0,T=1;
  90.  
  91. for(int i=1;i<=f;i++) scanf("%d%d",&ni[i],&fi[i]),sum+=ni[i];
  92. memset(map,0x3f,sizeof map);
  93. for(int i=0,x,y,z;i<p;i++){
  94. scanf("%d%d%d",&x,&y,&z);
  95. map[x][y]=map[y][x]=min(map[x][y],(LL)z);
  96. // map[x][y]=z;
  97. }
  98. for(int k=1;k<=f;k++){
  99. for(int i=1;i<=f;i++){
  100. if(i==k) continue;
  101. for(int j=1;j<=f;j++){
  102. if(i==j||k==j) continue;
  103. map[i][j]=min(map[i][j],map[i][k]+map[k][j]);
  104. }
  105. }
  106. }
  107. if(!judge(INF-1)) {
  108. puts("-1");
  109. return 0;
  110. }
  111. LL l=-1,r=INF-1,m;
  112. while(r-l>1){
  113. m=(l+r)/2;
  114. if(judge(m)){
  115. r=m;
  116. }else l=m;
  117. }
  118. printf("%lld\n",r);
  119. return 0 ;
  120. }

BZOJ 1738: [Usaco2005 mar]Ombrophobic Bovines 发抖的牛的更多相关文章

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

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

  2. BZOJ 1738: [Usaco2005 mar]Ombrophobic Bovines 发抖的牛 网络流 + 二分 + Floyd

    Description FJ's cows really hate getting wet so much that the mere thought of getting caught in the ...

  3. bzoj 1738 [Usaco2005 mar]Ombrophobic Bovines 发抖的牛 最大流+二分

    题目要求所有牛都去避雨的最长时间最小. 显然需要二分 二分之后考虑如何判定. 显然每头牛都可以去某个地方 但是前提是最短路径<=mid. 依靠二分出来的东西建图.可以发现这是一个匹配问题 din ...

  4. BZOJ1738 [Usaco2005 mar]Ombrophobic Bovines 发抖的牛

    先预处理出来每个点对之间的最短距离 然后二分答案,网络流判断是否可行就好了恩 /************************************************************ ...

  5. 【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 ...

  6. BZOJ 1739: [Usaco2005 mar]Space Elevator 太空电梯

    题目 1739: [Usaco2005 mar]Space Elevator 太空电梯 Time Limit: 5 Sec  Memory Limit: 64 MB Description The c ...

  7. BZOJ 1734: [Usaco2005 feb]Aggressive cows 愤怒的牛( 二分答案 )

    最小最大...又是经典的二分答案做法.. -------------------------------------------------------------------------- #inc ...

  8. bzoj 1734: [Usaco2005 feb]Aggressive cows 愤怒的牛

    1734: [Usaco2005 feb]Aggressive cows 愤怒的牛 Description Farmer John has built a new long barn, with N ...

  9. BZOJ 1682: [Usaco2005 Mar]Out of Hay 干草危机

    Description 牛们干草要用完了!贝茜打算去勘查灾情. 有N(2≤N≤2000)个农场,M(≤M≤10000)条双向道路连接着它们,长度不超过10^9.每一个农场均与农场1连通.贝茜要走遍每一 ...

随机推荐

  1. 图像处理函数详解——im2bw

    im2bw是基于转换为二值图像的算法,用的是otsu's method. matlab中DIP工具箱函数im2bw使用阈值(threshold)变换法把灰度图像(grayscale image)转换成 ...

  2. RMI原理

    一.分布式对象 在学习 RMI 之前,先来分布式对象(Distributed Object):分布式对象是指一个对象可以被远程系统所调用.对于 Java 而言,即对象不仅可以被同一虚拟机中的其他客户程 ...

  3. centos_Error: Protected multilib versions_解决方法

    在yum命令后面加入忽略参数:--setopt=protected_multilib=false you can also use --setopt=protected_multilib=false ...

  4. HTTPS协议学习总结

    目录 一:什么是HTTPS协议?二:客户端与服务端如何建立HTTPS协议连接?三:证书.加密协议.信息摘要.签名算法概念解释与关系梳理四:低版本操作系统作为客户端发送HTTPS失败分析五:参考资料   ...

  5. Eratosthenes筛选法

    说到素数,最基本的算是一百以内的那些数了.这些数在数学竟赛中常常会被用到.比如说有这样一道题:“一百以内有多少在加2后仍然是素数的素数?”11和17就是这样的素数.如果对素数很熟悉的话,就能迅速得出答 ...

  6. 解决64位win7系统IIS7[ODBC 驱动程序管理器]未发现数据源名称并且未指定默认驱动程序

    从网上下载了一个asp系统,数据库是Access类型的,运行环境为 64位Windows 7系统,IIS7,运行系统后,报如下错误: Microsoft OLE DB Provider for ODB ...

  7. 0708_Java如何设置输入流

    1.Java如何设置输入流:?(以解决看下面实例代码) 2.Java如何设置全局变量:(以解决public static即可) 3.Java为什么在做那种机试题目的时候都要设置成静态的:(以解决,因为 ...

  8. ACM学习

    转:ACM大量习题题库   ACM大量习题题库 现在网上有许多题库,大多是可以在线评测,所以叫做Online Judge.除了USACO是为IOI准备外,其余几乎全部是大学的ACM竞赛题库.   US ...

  9. linq递归

    public class Comment { public int Id { get; set; } public int ParentId { get; set; } public string T ...

  10. python 自动化之路 day 05

    内容目录: 列表生成式.迭代器&生成器 装饰器 软件目录结构规范 模块初始 常用模块 1.列表生成式,迭代器&生成器 列表生成式 需求:列表[0, 1, 2, 3, 4, 5, 6, ...