POJ2391 Ombrophobic Bovines
传送门
发现惊天大错误QAQ
T上天然后发现自己的板子是假的QAQ
就是这一句
if(!cur) return flow;
我之前一直写的是break。。。
注意实际意义
我们的dep[x]=-1是当前已经流不满无法増广了所以才把它设为-1不再增广
而流满了表示还可以继续增广所以直接return
我以前一直写的假板子直到这个题T飞。。。一个爆哭。。。
回归正传
这个题我们需要求最小化跑的最远的奶牛的时间
由此可以想到二分
二分以后我们需要找到最远的奶牛,可以通过预处理出两两牛棚的最短路来进行连边
所以最后的图大概是这个样子
对于每一个田地拆成两个点 初始牛和牛棚
源点连牛流量为牛的数量 牛棚连汇点流量为牛棚的容量 对于二分的mid 我们对dis[i][j]<=mid的连边流量为inf
然后看最后是否能满流就可以啦
二分+判断满流也是一个常见套路呢(另外一个是枚举+残存网络加边)
附代码。(注意longlong又一个爆哭)
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define inf 1000000000000ll
#define ll long long
using namespace std;struct edge{int to,lt;ll f;}e[320010],p[3010];
int in[420],cnt,s,t,n,m,ip[420];
queue<int> que;ll dis[420][420],dep[420],tot;
void addpath(int x,int y,ll f)
{p[++cnt].to=y;p[cnt].lt=ip[x];p[cnt].f=f;ip[x]=cnt;p[++cnt].to=x;p[cnt].lt=ip[y];p[cnt].f=f;ip[y]=cnt;
}
void add(int x,int y,ll f)
{e[++cnt].to=y;e[cnt].lt=in[x];e[cnt].f=f;in[x]=cnt;e[++cnt].to=x;e[cnt].lt=in[y];e[cnt].f=0;in[y]=cnt;
}
void floyd()
{memset(dis,48,sizeof(dis));//printf("%lld\n",dis[0][0]);for(int i=1;i<=n;i++) dis[i][i]=0;for(int i=1;i<=n;i++)for(int j=ip[i];j;j=p[j].lt)dis[i][p[j].to]=min(dis[i][p[j].to],p[j].f);for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
bool bfs()
{while(!que.empty()) que.pop();memset(dep,0,sizeof(dep));dep[s]=1;que.push(s);while(!que.empty()){int x=que.front();que.pop();//printf("%d %d\n",x,in[x]);printf("QAQ");for(int i=in[x];i;i=e[i].lt){int y=e[i].to;if(!dep[y]&&e[i].f){dep[y]=dep[x]+1;if(y==t) return 1;que.push(y);}}}return 0;
}
ll dfs(int x,ll flow)
{if(x==t||!flow) return flow;ll cur=flow;for(int i=in[x];i;i=e[i].lt){int y=e[i].to;if(dep[y]==dep[x]+1&&e[i].f){ll tmp=dfs(y,min(cur,e[i].f));e[i].f-=tmp;e[i^1].f+=tmp;cur-=tmp;if(!cur) return flow;}}dep[x]=-1;return flow-cur;
}
ll dinic()
{ll ans=0;while(bfs()) ans+=dfs(s,inf);//printf("%d\n",ans);return ans;
}
int cow[400],she[400];
bool check(ll tmp)
{cnt=1;memset(in,0,sizeof(in));for(int i=1;i<=n;i++)for(int j=1;j<=n;j ++)if(dis[i][j]<=tmp) add(i,n+j,inf);for(int i=1;i<=n;i++) add(s,i,cow[i]),add(n+i,t,she[i]);ll cur=dinic();//printf("%lld %lld\n",tmp,cur);return cur==tot;
}
ll erf()
{ll l=0,r=inf,mid,ans=inf;while(l<=r){mid=(l+r)>>1;//printf("%lld\n",mid);if(check(mid)) ans=mid,r=mid-1;else l=mid+1;}return ans;
}
int main()
{//int n,m;scanf("%d%d",&n,&m);s=2*n+1;t=s+1;for(int i=1;i<=n;i++) scanf("%d%d",&cow[i],&she[i]),tot+=cow[i];for(int i=1;i<=m;i++){int x,y;ll f;scanf("%d%d%lld",&x,&y,&f);addpath(x,y,f);}floyd();ll ans=erf();printf("%lld\n",ans==inf?-1:ans);return 0;
}
转载于:https://www.cnblogs.com/hanyuweining/p/10321952.html
POJ2391 Ombrophobic Bovines相关推荐
- POJ-2391 Ombrophobic Bovines 网络流-拆点构图
题意:有F快草地,每块草地上有若干奶牛也有避雨点,每个避雨点只能够容纳一定量的奶牛.草地之间有边.现在问所有牛全部到达避雨点的时间是多少? 解法:这题和POJ-2112非常相似,做法也差不多,foly ...
- poj2391 Ombrophobic Bovines 拆点连边要注意
[题意]:给定F个牛棚和P条路径,每条路径有一个长度,现在每个牛棚有一定的容量和牛数,因为牛棚牛数可能大于容量,所以要牛棚之间的牛要进行相互地移动,每移动一个距离就花费一单位的时间,求从开始移动到每头 ...
- BZOJ 1738: [Usaco2005 mar]Ombrophobic Bovines 发抖的牛( floyd + 二分答案 + 最大流 )
一道水题WA了这么多次真是.... 统考终于完 ( 挂 ) 了...可以好好写题了... 先floyd跑出各个点的最短路 , 然后二分答案 m , 再建图. 每个 farm 拆成一个 cow 点和一个 ...
- POJ 2391 Ombrophobic Bovines ★(Floyd+二分+拆点+最大流)
[题意]有n块草地,一些奶牛在草地上吃草,草地间有m条路,一些草地上有避雨点,每个避雨点能容纳的奶牛是有限的,给出通过每条路的时间,问最少需要多少时间能让所有奶牛进入一个避雨点. 和POJ2112很类 ...
- POJ 2391 Ombrophobic Bovines 网络流 建模
[题目大意] 给定一个无向图,点i处有Ai头牛,点i处的牛棚能容纳Bi头牛,求一个最短时间T使得在T时间内所有的牛都能进到某一牛棚里去.(1 <= N <= 200, 1 <= M ...
- 【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 ...
- [颓废史]蒟蒻的刷题记录
QAQ蒟蒻一枚,其实我就是来提供水题库的. 以下记录从2016年开始. 1.1 1227: [SDOI2009]虔诚的墓主人 树状数组+离散化 3132: 上帝造题的七分钟 树状数组 二维区间加减+查 ...
- 【HDOJ图论题集】【转】
1 =============================以下是最小生成树+并查集====================================== 2 [HDU] 3 1213 How ...
- 一系列图论问题[转]
=============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...
最新文章
- 单片机while用法c语言例子,51单片机-C语言之while(!x)的理解
- android 界面切换【转】
- iscsi 同步_群晖六盘位旗舰NAS,一文教你如何解决多设备同步,跨平台协调
- 哥德巴赫猜想(信息学奥赛一本通-T1157)
- 深交所与工信部签署优质中小企业上市培育战略合作协议
- linux ipv4 keepalive,Linux中keepalive的使用
- 服务器维修解锁,云服务器解锁
- c 程序设计语言第一次作业,重大2017年C++程序设计语言第一次作业(含答案).doc...
- HDOJ 1025 DP
- Cryengine渲染引擎剖析(转)
- 应用程序开发选择工具应注重运行效率还是易用性
- 两个路由器如何通过一根网线组建局域网(非wifi桥接方式)
- 20145213《Java程序设计》第五周学习总结
- 如何快速求出与n互素的数有多少个?
- 基于Dockerfile制作镜像
- 音乐节为什么需要网络覆盖?如何搭建临时稳定WiFi?
- the android sdk location cannot be at the filesystem root.的解决方案
- Devexpress中统一设置字体样式的方法
- WIN7 XP设置MTU,提升下载速度
- 如何进行视频抠像?视频抠像一键搞定