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

一开始想拆点建图,0到x集合为汇,值为各个区域的牛数量, Y到终点连边,值为各个区域的容量,然后就是看怎么连x和y了

我一开始把可以连接的X和Y连起来,把可以互达的点在Y集合点那里连边,这样很麻烦,先跑一遍floyd把点到点的最短路求出来,然后直接X和Y集合可达即相连就行

二分结果,再建图,把在mid以内的X点对Y点连起来,跑最大流 判断结果即可

注意要用long long

一开始还没看清题意,一条路上可以同时走无数的牛,我一开始以为只能走一头,还敲MCMF去了。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#define LL long long
#define INF 1LL<<60
using namespace std;
int f,p;
const int maxn=500;
struct Edge
{int from,to,cap,flow;
};
struct Dinic
{vector<Edge>edges;vector<int> G[maxn];int vis[maxn];int cur[maxn];int d[maxn];void init(int n){edges.clear();for (int i=0; i<=n; i++){G[i].clear();}}void addedge(int from,int to,int cap){int m;edges.push_back((Edge){from,to,cap,0});edges.push_back((Edge){to,from,0,0});m=edges.size();G[from].push_back(m-2);G[to].push_back(m-1);}bool bfs(int s,int t){memset(vis,0,sizeof vis);queue<int> q;q.push(s);d[s]=0;vis[s]=1;while (!q.empty()){int u=q.front();q.pop();for (int i=0; i<G[u].size(); i++){Edge& e=edges[G[u][i]];if (!vis[e.to] && e.cap>e.flow){vis[e.to]=1;d[e.to]=d[u]+1;q.push(e.to);}}}return vis[t];}int dfs(int x,int a,int t){if (x==t || a==0) return a;int flow=0,f;for (int& i=cur[x]; i<G[x].size(); i++){Edge& e=edges[G[x][i]];if (d[x]+1==d[e.to] && (f=dfs(e.to,min(a,e.cap-e.flow),t))>0){e.flow+=f;edges[G[x][i]^1].flow-=f;flow+=f;a-=f;if (a==0) break;}}return flow;}int maxflow(int s,int t){int flow=0;while (bfs(s,t)){memset(cur,0,sizeof cur);flow+=dfs(s,100000000,t);}return flow;}
} mcmf;
int A[210],B[210];
LL path[210][210];
LL N;
void floyd()
{for (int i=1; i<=f; i++){for (int j=1; j<=f; j++){for (int k=1; k<=f; k++){if (j==k) continue;path[j][k]=min(path[j][k],path[j][i]+path[i][k]);N=max(N,path[j][k]);}}}
}
int main()
{//freopen("POJ_2391.in","r",stdin);int a,b;LL c;while (scanf("%d%d",&f,&p)!=EOF){int cur=0;for (int i=1; i<=f; i++){scanf("%d%d",&A[i],&B[i]);cur+=A[i];for(int j=1; j<=f; j++) path[i][j]=INF;}for (int i=1; i<=p; i++){scanf("%d%d%lld",&a,&b,&c);path[a][b]=min(path[a][b],c);path[b][a]=min(path[b][a],c);}N=0;floyd();LL l,r,mid;l=1,r=N;//cout<<l<<" "<<r<<endl;LL ans=-1;while(l<r){mcmf.init(2*f+10);for (int i=1; i<=f; i++){mcmf.addedge(0,i,A[i]);mcmf.addedge(i,i+f,1<<30);}for (int i=1; i<=f; i++){mcmf.addedge(i+f,2*f+5,B[i]);}mid=(r+l)>>1;for (int i=1;i<=f;i++){for (int j=1;j<=f;j++){if (path[i][j]>mid || i==j) continue;mcmf.addedge(i,f+j,1<<30);}}int res=mcmf.maxflow(0,2*f+5);if (res>=cur){//cout<<res<<" "<<cur<<endl;//cout<<mid<<endl;ans=mid;r=mid;}else{l=mid+1;}}printf("%lld\n",ans);}return 0;
}

  

转载于:https://www.cnblogs.com/kkrisen/p/4013528.html

POJ 2391 Ombrophobic Bovines 网络流 建模相关推荐

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

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

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

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

  3. poj pku图论、网络流入门题总结、汇总

    poj pku图论.网络流入门题总结.汇总 分类: acm图论 2010-08-25 18:49 243人阅读 评论(0) 收藏 举报 网络算法networkgraphconstructioninte ...

  4. 网络流建模汇总(转自Edelweiss)

    最大流 <POJ 1149    PIGS> [题目大意] 有 M 个猪圈,每个猪圈里初始时有若干头猪.一开始所有猪圈都是关闭的.依 次来了 N  个顾客,每个顾客分别会打开指定的几个猪圈 ...

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

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

  6. 网络流建模方法(四)—— 互不攻击问题 洛谷 P3353 骑士共存问题 (附 洛谷 P2774 方格取数问题)

    网络流建模方法(四)互不攻击问题,或者说是共存问题, 这类题目看起来有点像二分图匹配,这类题目我们就是建一个二分图然后跑最大流 还是先说题目洛谷P3353 题目描述 在一个 nn个方格的国际象棋棋盘上 ...

  7. BZOJ 1822 浅谈计算几何在网络流建模中的实际运用

    世界真的很大 网络流是个神奇东西,可以用来解决很多意想不到的问题 但是做题久了,有套路了,大多数网络流也就不是那么难 只要建好模型,跑模板就OK 然后就会出现某些丧心病狂的出题人想到干脆卡一下建边之类 ...

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

  9. [NetworkFlow]网络流建模相关

    流 网络流问题本质上是线性规划问题的应用之一,线性规划问题的标准形式是给出一组等式约束和不等式约束,要求最优化一个线性函数. 在流问题中,变量以流量的形式出现在问题中,我们给出一个流网络(以有向图的形 ...

最新文章

  1. 提取操作系统的基本信息(内核、系统版本、网络地址等)
  2. 疫情加速人脸识别落地:多地试点AI门禁,居民刷脸核验健康码
  3. python适合找哪方面工作_学习python后能做哪方面的工作
  4. 二分查找(循序渐进由0到1掌握二分)
  5. NEFU704(AC自动机+状态压缩)
  6. asp.net(C#)页面事件顺序
  7. 最小化安装 linux 安装图形化界面,那些最小化centos7安装图形化界面的坑
  8. 字符串匹配(KMP)算法及Java实现
  9. linux虚拟机上挂载U盘
  10. 模糊C均值聚类算法(原理+Matlab代码)
  11. 2021年中国国内生产总值(GDP)、GDP结构及人均国内生产总值分析[图]
  12. 句法结构可视化工具(成分句法)
  13. 如何用C语言编程序化交易,程序化交易的开发步骤
  14. *TEST 2 for NOIP 妈的智障
  15. 从IIS到PAGE对象:ASP.NET之旅
  16. Ubuntu下添加开机启动项的2种方法
  17. 入门软件测试要学什么?软件测试技术学习教程分享
  18. 已offer | 小米手机部一二面
  19. 《增强现实:原理、算法与应用》读书笔记(5)运动恢复结构(上)初始化、相机位姿估计、集束调整
  20. ICCV2021 | Vision Transformer中相对位置编码的反思与改进

热门文章

  1. Android自定义ScrollView
  2. 算法:螺旋矩阵 ||
  3. 小米面试:字符串解码
  4. golang中的strings.HasSuffix
  5. golang操作mysql
  6. 常见排序算法时间复杂度
  7. linux命令netstat
  8. 静态链接库与动态链接库的优缺点
  9. 常考数据结构与算法:实现二叉树先序,中序和后序遍历
  10. 常考数据结构与算法:数组中未出现的最小正整数