二分答案,每一头牛向所有在规定时间内能走到的牛棚连inf的边,每一个源点向牛连牛数量的边,每一个牛棚向汇点连牛棚容量的边,能满流则意味着这个答案可行,否则不可行。

  1. 1 #include<bits/stdc++.h>
  2. 2 using namespace std;
  3. 3 #define N 505
  4. 4 #define ll long long
  5. 5 #define inf 0x3f3f3f3f
  6. 6 struct ji{
  7. 7 int nex,to,len;
  8. 8 }e[N*N],edge[N*N];
  9. 9 queue<int>q;
  10. 10 int E,EE,n,m,x,y,z,s,a[N],d[N],head[N],work[N];
  11. 11 ll f[N][N];
  12. 12 void add(int x,int y,int z){
  13. 13 edge[E].nex=head[x];
  14. 14 edge[E].to=y;
  15. 15 edge[E].len=z;
  16. 16 head[x]=E++;
  17. 17 if (E&1)add(y,x,0);
  18. 18 }
  19. 19 bool bfs(){
  20. 20 q.push(0);
  21. 21 memset(d,-1,sizeof(d));
  22. 22 d[0]=0;
  23. 23 while (!q.empty()){
  24. 24 int k=q.front();
  25. 25 q.pop();
  26. 26 for(int i=head[k];i!=-1;i=edge[i].nex)
  27. 27 if ((edge[i].len)&&(d[edge[i].to]<0)){
  28. 28 d[edge[i].to]=d[k]+1;
  29. 29 q.push(edge[i].to);
  30. 30 }
  31. 31 }
  32. 32 return d[n]>=0;
  33. 33 }
  34. 34 int dfs(int k,int s){
  35. 35 if (k==n)return s;
  36. 36 int p;
  37. 37 for(int &i=work[k];i!=-1;i=edge[i].nex)
  38. 38 if ((edge[i].len)&&(d[edge[i].to]==d[k]+1)){
  39. 39 p=dfs(edge[i].to,min(s,edge[i].len));
  40. 40 if (p){
  41. 41 edge[i].len-=p;
  42. 42 edge[i^1].len+=p;
  43. 43 return p;
  44. 44 }
  45. 45 }
  46. 46 return 0;
  47. 47 }
  48. 48 int dinic(){
  49. 49 int k,ans=0;
  50. 50 while (bfs()){
  51. 51 memcpy(work,head,sizeof(work));
  52. 52 while (k=dfs(0,inf))ans+=k;
  53. 53 }
  54. 54 return ans;
  55. 55 }
  56. 56 bool pd(ll k){
  57. 57 for(int i=1;i<=n/2;i++)
  58. 58 for(int j=1;j<=n/2;j++)
  59. 59 if (f[i][j]<=k)add(i,j+n/2,inf);
  60. 60 int t=dinic();
  61. 61 memcpy(head,a,sizeof(a));
  62. 62 memcpy(edge,e,sizeof(e));
  63. 63 E=EE;
  64. 64 return t==s;
  65. 65 }
  66. 66 int main(){
  67. 67 scanf("%d%d",&n,&m);
  68. 68 memset(head,-1,sizeof(head));
  69. 69 for(int i=1;i<=n;i++){
  70. 70 scanf("%d%d",&x,&y);
  71. 71 add(0,i,y);
  72. 72 add(n+i,2*n+1,x);
  73. 73 s+=x;
  74. 74 }
  75. 75 memset(f,inf,sizeof(f));
  76. 76 for(int i=1;i<=n;i++)f[i][i]=0;
  77. 77 for(int i=1;i<=m;i++){
  78. 78 scanf("%d%d%d",&x,&y,&z);
  79. 79 f[x][y]=f[y][x]=min(f[x][y],1LL*z);
  80. 80 }
  81. 81 for(int i=1;i<=n;i++)
  82. 82 for(int j=1;j<=n;j++)
  83. 83 for(int k=1;k<=n;k++)
  84. 84 f[j][k]=min(f[j][k],f[j][i]+f[i][k]);
  85. 85 n=n*2+1;
  86. 86 ll l=0,r=2e11;
  87. 87 memcpy(a,head,sizeof(a));
  88. 88 memcpy(e,edge,sizeof(e));
  89. 89 EE=E;
  90. 90 while (l<r){
  91. 91 ll mid=(l+r>>1);
  92. 92 if (pd(mid))r=mid;
  93. 93 else l=mid+1;
  94. 94 }
  95. 95 if (l==2e11)l=-1;
  96. 96 printf("%lld",l);
  97. 97 }

[bzoj1738]发抖的牛的更多相关文章

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

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

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

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

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

  4. BZOJ 1738: [Usaco2005 mar]Ombrophobic Bovines 发抖的牛

    Description 约翰的牛们非常害怕淋雨,那会使他们瑟瑟发抖.他们打算安装一个下雨报警器,并且安排了一个撤退计划.他们需要计算最少的让所有牛进入雨棚的时间.    牛们在农场的F(1≤F≤200 ...

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

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

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

  7. bzoj Usaco补完计划(优先级 Gold>Silver>资格赛)

    听说KPM初二暑假就补完了啊%%% 先刷Gold再刷Silver(因为目测没那么多时间刷Silver,方便以后TJ2333(雾 按AC数降序刷 ---------------------------- ...

  8. bzoj usaco 金组水题题解(2)

    续.....TAT这回不到50题编辑器就崩了.. 这里塞40道吧= = bzoj 1585: [Usaco2009 Mar]Earthquake Damage 2 地震伤害 比较经典的最小割?..然而 ...

  9. BZOJ-USACO被虐记

    bzoj上的usaco题目还是很好的(我被虐的很惨. 有必要总结整理一下. 1592: [Usaco2008 Feb]Making the Grade 路面修整 一开始没有想到离散化.然后离散化之后就 ...

随机推荐

  1. 如何迁移 Spring Boot 到函数计算

    作者 | 田小单 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上 ...

  2. 洛谷3233 HNOI2014(虚树+dp)

    膜拜一发\(mts\_246,forever\_shi\) 这两位爷是真的无敌! 首先来看这个题,一看题目的数据范围和"关键点"字眼,我们就能得知这是一道虚树题 那就先一如既往的建 ...

  3. python中函数里面冒号和函数后面的箭头是什么含义

    函数里参数后的冒号其实是参数的类型建议,但是只是建议,就算你不按约定传也不会报错.而后面的箭头,则是函数返回值的类型建议.  

  4. 使用vue-cli+webpack搭建vue开发环境

    在这里我真的很开心,好久没有用过博客,今天突然看到了我的博客有不少人看过,虽然没有留下脚印,但是还是激起了我重新拿起博客的信心,感谢大家. 在这里我们需要首先下载node,因为我们要用到npm包下载, ...

  5. FastAPI 学习之路(五十三)根据环境不同连接不同数据库

    在实际的开发过程中,我们数据库,可以根据连接的环境不一样,我们会拆分成不一样的数据库,根据我们所要用的环境来选择对应的数据库即可,那么我们应该如何去实现根据选择去选择不一样的数据库呢. 首先,我们找一 ...

  6. Golang通脉之反射

    什么是反射 官方关于反射定义: Reflection in computing is the ability of a program to examine its own structure, pa ...

  7. 第二次Scrum Metting

    日期:2021年4月25日会议主要内容概述:前后端针对WebAPI进行协调与统一工作,商量接下来两日计划:敲定部分设计细节. 一.进度情况 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作中 ...

  8. RSA加密——前端JSEncrypt

    RSA加密--前端JSEncrypt 介绍 ​ JSEncrypt是一个RSA加密库,在没有SSL加密传输通道支持https协议的情况下,该库可以在http传输重要信息如时,保证数据的安全性.我们小组 ...

  9. VS2019、Qt5.12及QGis3.16开发常见问题汇总

    在C++.Qt软件开发过程中,常常遇到一些编译错误或警告:本文将VS2019.Qt5.12.10和QGis3.16.10的二次开发过程常见的问题做了整理,供大家参考,也便于日后查阅.该内容分为四部分: ...

  10. Register Abstraction(9)

    This post will explain how to use the UVM Register Abstraction Layer (RAL) to generate register tran ...