POJ 2391 Ombrophobic Bovines 网络流 建模
【题目大意】
给定一个无向图,点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 网络流 建模相关推荐
- POJ 2391 Ombrophobic Bovines ★(Floyd+二分+拆点+最大流)
[题意]有n块草地,一些奶牛在草地上吃草,草地间有m条路,一些草地上有避雨点,每个避雨点能容纳的奶牛是有限的,给出通过每条路的时间,问最少需要多少时间能让所有奶牛进入一个避雨点. 和POJ2112很类 ...
- POJ-2391 Ombrophobic Bovines 网络流-拆点构图
题意:有F快草地,每块草地上有若干奶牛也有避雨点,每个避雨点只能够容纳一定量的奶牛.草地之间有边.现在问所有牛全部到达避雨点的时间是多少? 解法:这题和POJ-2112非常相似,做法也差不多,foly ...
- poj pku图论、网络流入门题总结、汇总
poj pku图论.网络流入门题总结.汇总 分类: acm图论 2010-08-25 18:49 243人阅读 评论(0) 收藏 举报 网络算法networkgraphconstructioninte ...
- 网络流建模汇总(转自Edelweiss)
最大流 <POJ 1149 PIGS> [题目大意] 有 M 个猪圈,每个猪圈里初始时有若干头猪.一开始所有猪圈都是关闭的.依 次来了 N 个顾客,每个顾客分别会打开指定的几个猪圈 ...
- BZOJ 1738: [Usaco2005 mar]Ombrophobic Bovines 发抖的牛( floyd + 二分答案 + 最大流 )
一道水题WA了这么多次真是.... 统考终于完 ( 挂 ) 了...可以好好写题了... 先floyd跑出各个点的最短路 , 然后二分答案 m , 再建图. 每个 farm 拆成一个 cow 点和一个 ...
- 网络流建模方法(四)—— 互不攻击问题 洛谷 P3353 骑士共存问题 (附 洛谷 P2774 方格取数问题)
网络流建模方法(四)互不攻击问题,或者说是共存问题, 这类题目看起来有点像二分图匹配,这类题目我们就是建一个二分图然后跑最大流 还是先说题目洛谷P3353 题目描述 在一个 nn个方格的国际象棋棋盘上 ...
- BZOJ 1822 浅谈计算几何在网络流建模中的实际运用
世界真的很大 网络流是个神奇东西,可以用来解决很多意想不到的问题 但是做题久了,有套路了,大多数网络流也就不是那么难 只要建好模型,跑模板就OK 然后就会出现某些丧心病狂的出题人想到干脆卡一下建边之类 ...
- 【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 ...
- [NetworkFlow]网络流建模相关
流 网络流问题本质上是线性规划问题的应用之一,线性规划问题的标准形式是给出一组等式约束和不等式约束,要求最优化一个线性函数. 在流问题中,变量以流量的形式出现在问题中,我们给出一个流网络(以有向图的形 ...
最新文章
- 提取操作系统的基本信息(内核、系统版本、网络地址等)
- 疫情加速人脸识别落地:多地试点AI门禁,居民刷脸核验健康码
- python适合找哪方面工作_学习python后能做哪方面的工作
- 二分查找(循序渐进由0到1掌握二分)
- NEFU704(AC自动机+状态压缩)
- asp.net(C#)页面事件顺序
- 最小化安装 linux 安装图形化界面,那些最小化centos7安装图形化界面的坑
- 字符串匹配(KMP)算法及Java实现
- linux虚拟机上挂载U盘
- 模糊C均值聚类算法(原理+Matlab代码)
- 2021年中国国内生产总值(GDP)、GDP结构及人均国内生产总值分析[图]
- 句法结构可视化工具(成分句法)
- 如何用C语言编程序化交易,程序化交易的开发步骤
- *TEST 2 for NOIP 妈的智障
- 从IIS到PAGE对象:ASP.NET之旅
- Ubuntu下添加开机启动项的2种方法
- 入门软件测试要学什么?软件测试技术学习教程分享
- 已offer | 小米手机部一二面
- 《增强现实:原理、算法与应用》读书笔记(5)运动恢复结构(上)初始化、相机位姿估计、集束调整
- ICCV2021 | Vision Transformer中相对位置编码的反思与改进