题意: 已知有 N 个牛棚,且每个牛棚在一开始的时候有一定数量的牛,每个牛棚可以用来让牛避雨,但容量都有一定的限制,知道了一些牛棚之间的道路长度,

问使得下雨时使所有牛都可以找到地方躲雨,且要使得所有牛中走过的路中的最大值尽可能小,并求出该最大值

分析: 建图:

将每个牛棚拆成两个点v,v`

建立一个源点 s =0 ,        在 s 和每个点 i 之间连一条容量大小为该牛棚初始牛数量的边,

建立一个汇点 t =2*n+1     在 每个点 i+n 和 t 之间连一条容量大小为该牛棚容量的边。

如果点 u 和 v 满足条件,就在 u 和 v +n ,v 和 u+n之间连一条容量大小为 INF 的边。

如果最大流 = 牛的数量 ,即说明该情况符合。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define clr(x)memset(x,0,sizeof(x))
#define INF 0x1f1f1f1f
#define min(a,b)(a)<(b)?(a):(b)
int v[405][405];
int gap[405];
int dis[405];
int c[405][405];
void init(int s,int u,int n)
{int v,x,front=0,rear=0;int q[405];clr(gap);memset(dis,0xff,sizeof(dis));q[rear++]=u;dis[u]=0;while(front<rear){x=q[front++];gap[dis[x]]++;for(v=0;v<=n;v++)if(dis[v]==-1&&c[v][x]>0){dis[v]=dis[x]+1;q[rear++]=v;}}
}
int sap(int s,int u,int n)
{init(s,u,n);int flag,flow=0,top=s,i,j,k;int pre[405];int low[405];while(dis[s]<=n){flag=0;low[s]=INF;for(i=0;i<=n;i++)if(c[top][i]>0&&dis[top]==dis[i]+1&&dis[i]>=0){flag=1;break;}if(flag){low[i]=c[top][i];low[i]=min(low[i],low[top]);pre[i]=top;top=i;if(top==u){flow+=low[u];j=top;while(j!=s){k=pre[j];c[k][j]-=low[u];c[j][k]+=low[u];j=k;}top=s;clr(low);}}else{int dmin=n;for(j=0;j<=n;j++)if(c[top][j]>0&&dis[j]+1<dmin&&dis[j]>=0)dmin=dis[j]+1;gap[dis[top]]--;if(gap[dis[top]]==0)break;gap[dmin]++;dis[top]=dmin;if(top!=s)top=pre[top];}}return flow;
}
long long g[405][405];
int st[202];
int ho[202];
int ok(long long ti,int s,int n,int tot)
{int i,j,flow;clr(c);for(i=1;i<=n;i++){c[s][i]=st[i];c[i+n][n*2+1]=ho[i];}for(i=1;i<=n;i++)for(j=1;j<=n;j++)if(g[i][j]!=-1&&g[i][j]<=ti){c[i][j+n]=INF;c[j][i+n]=INF;}flow=sap(s,2*n+1,2*n+1);if(flow==tot)return 1;return 0;
}
int main()
{int s,t,n,m,i,j,k,a,b,t1,t2;long long low,high,mid,res,w;while(scanf("%d%d",&n,&m)!=EOF){s=0;t1=t2=0;high=0;for(i=1;i<=n;i++){scanf("%d%d",&st[i],&ho[i]);t1+=st[i];t2+=ho[i];}memset(g,-1,sizeof(g));while(m--){scanf("%d%d%lld",&a,&b,&w);if(g[a][b]==-1||w<g[a][b]){//high+=w;g[a][b]=g[b][a]=w;}}if(t1>t2){printf("-1\n");continue;}for(k=1;k<=n;k++)for(i=1;i<=n;i++)if(g[i][k]!=-1)for(j=1;j<=n;j++)if(g[k][j]!=-1&&(g[i][k]+g[k][j]<g[i][j]||g[i][j]==-1))g[i][j]=g[i][k]+g[k][j];for(i=1;i<=n;i++)g[i][i]=0;low=0;high=0;for(i=1;i<=n;i++)for(j=1;j<=n;j++)if(g[i][j]>high)high=g[i][j];res=-1;while(low<=high){mid=(low+high)>>1;if(ok(mid,s,n,t1)){res=mid;high=mid-1;}elselow=mid+1;}printf("%lld\n",res);}return 0;
}

转载于:https://www.cnblogs.com/dream-wind/archive/2012/08/14/2638351.html

POJ 2391 Ombrophobic Bovines【二分+最大流】相关推荐

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

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

  2. POJ 2391 Ombrophobic Bovines 网络流 建模

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

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

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

  4. POJ 2112 Optimal Milking(二分+最大流)

    POJ 2112 Optimal Milking 题目链接 题意:给定一些机器和奶牛,在给定距离矩阵,(不在对角线上为0的值代表不可达),每一个机器能容纳m个奶牛.问全部奶牛都能挤上奶,那么走的距离最 ...

  5. POJ3228二分最大流

    题意:       有n个点,每个点有两个权值,金子数量还有仓库容量,金子可以存在自己的仓库里或者是别的仓库里,仓库和仓库之间有距离,问所有金子都必须存到库里最大距离的最小是多少? 思路:       ...

  6. hdu4560 不错的建图,二分最大流

    题意: 我是歌手 Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Subm ...

  7. P4068-[SDOI2016]数字配对【二分,费用流】

    正题 题目链接:https://www.luogu.com.cn/problem/P4068 题目大意 nnn种数字,第iii个是aia_iai​,有bib_ibi​个,价值为ci∗cjc_i*c_j ...

  8. poj 1064 java_poj 1064(二分答案)

    题意: 有N条绳子,长度分别为 length[1,2,3,........,N]. 如果从它们中切割出K条长度相同的绳子,这K条绳子每条最长有多长? 结果保留两位小数. 题解: 二分可能的长度. AC ...

  9. Linux等比数列脚本求和,POJ 1845 (约数和+二分等比数列求和)

    题目大意:A^B的所有约数和,mod 9901. 解题思路: ①整数唯一分解定理: 一个整数A一定能被分成:A=(P1^K1)*(P2^K2)*(P3^K3).....*(Pn^Kn)的形式.其中Pn ...

  10. POJ - 1905 (几何+二分)

    POJ - 1905 (几何+二分) 题目正文如下: When a thin rod of length L is heated n degrees, it expands to a new leng ...

最新文章

  1. axure 下拉多选 元件_Axure教程:下拉多选列表集合(多选下拉列表+单选下拉列表+分级下拉列表)...
  2. JBoss was unable to start within 50 seconds-JBoss启动超时
  3. 深入剖析.NET运行机制
  4. oracle传date参数十二小时,Oracle数据库中 to_date()与24小时制表示法及mm分钟的显示...
  5. 03、动态代理--CGLib引入增强
  6. 字体小于12px解决办法
  7. 研华运动控制卡接线图_研华运动控制卡 SoftMotion 技术简介
  8. 降低站长成本 推荐8个免费或低廉小型建站工具
  9. 父与子python第三版_正版 父与子的编程之旅 与小卡特一起学Python 第3版(全彩印刷) 小学生编程少儿编程真好玩入门教程童趣味亲子互动教孩子学编程书...
  10. 4G标准之争,攘外须先安内
  11. bracktrack5r3安装+bt5r3下安装vmwaretools
  12. 爬取中国地震台网以及地震科学数据
  13. 在线教育开源源码:线上教育如今各种“陷阱营销”,应如何规避?
  14. 2022智博会| 麒麟信安携操作系统亮相华为展台
  15. matlab之设置坐标轴范围和纵横比函数axis
  16. matlab减小数据方差,最小方差控制
  17. 异常检测——5月(task1)
  18. ajax异步刷新gridview,如何刷新Gridview的内容(ajax)
  19. Jenkins实现微服务自动化部署_Jenkins环境设置完整版 (二)
  20. 获取地图数据GEOJSON还有OSM

热门文章

  1. java8 merge_给老弟讲解java8中的marge()方法,一顿骚操作
  2. java 打牌游戏_java代码-----实现4个人打牌游戏的相关代码。线程
  3. mysql获取多张表中的数据_mysql – 从具有递归关系的两个表中获取数据
  4. wordpress mysql port_Kubernetes
  5. 从具体案例了解知识图谱构建流程
  6. 那些让人惊叹的命令执行效果
  7. 从云计算到人工智能 都逃不过被炒作的命运
  8. 结构体 内存对齐 keil STM32
  9. Selenium webdriver实现原理
  10. yourphp添加KindEditor编辑器