POJ 2391 Ombrophobic Bovines【二分 网络流】
题目大意:F个草场,P条道路(无向),每个草场初始有几头牛,还有庇护所,庇护所有个容量,每条道路走完都有时间,问所有奶牛都到庇护所最大时间最小是多少?
思路:和POJ2112一样的思路,二分以后构建网络流跑就行TUT,问题是,这题是无向边!!无向边啊 题目还给出
3 2 70
2 3 90
这么让人觉得是有向边的数据,纠结过这个之后再把数组开小点(开打了会TLE )然后就能AC了
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <queue>
#define maxn 100009
#define esp 0.001
#define inf 0x3f3f3f3f
using namespace std;
long long head[maxn],next[maxn],point[maxn],flow[maxn];
long long append[maxn];
long long dist[maxn],dis[300][300],now=0,full=0,cow[maxn],shelter[maxn];
long long cop[maxn];
inline void add(long long x,long long y,long long u,long long v)
{
next[++now]=head[x];
head[x]=now;
point[now]=y;
flow[now]=u;
append[now]=v;
next[++now]=head[y];
head[y]=now;
point[now]=x;
flow[now]=0;
append[now]=v;
}
int bfs(long long s,long long t,long long x)
{
queue<long long>q;
q.push(s);
memset(dist,-1,sizeof(dist));
dist[s]=0;
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=head[u];i;i=next[i])
{
int k=point[i];
if(dist[k]==-1 && flow[i] &&append[i]<=x)
{
dist[k]=dist[u]+1;
q.push(k);
}
}
}
return dist[t]!=-1;
}
int dfs(long long s,long long d,long long t,long long x)
{
if(s==t)return d;
long long res=0;
for(int i=head[s];i&&res<d;i=next[i])
{
int u=point[i];
if(dist[u]==dist[s]+1 &&flow[i] && append[i]<=x)
{
int dd=dfs(u,min(flow[i],d-res),t,x);
if(dd)
{
flow[i]-=dd;
flow[((i-1)^1)+1]+=dd;
res+=dd;
}
}
}
if(!res)dist[s]=-1;
return res;
}
int judge(long long x,int s,int t)
{
long long ans=0;
while(bfs(s,t,x))
ans+=dfs(s,inf,t,x);
memcpy(flow,cop,sizeof(flow));
if(ans==full)return 1;else return 0;
}
int main()
{
long long n,m,x,y,v;
long long l=0,r=0;
memset(dis,-1,sizeof(dis));
scanf("%I64d%I64d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%I64d%I64d",&cow[i],&shelter[i]);
full+=cow[i];
}
for(int i=1;i<=m;i++)
{
scanf("%I64d%I64d%I64d",&x,&y,&v);
if(dis[x][y]==-1)dis[x][y]=dis[y][x]=v;
else dis[x][y]=dis[y][x]=min(dis[x][y],(long long)v);
r=max(r,dis[x][y]);
}
long long s=2*n+10,t=2*n+11;
for(int i=1;i<=n;i++)add(s,i,cow[i],0);
for(int i=1;i<=n;i++)add(n+1+i,t,shelter[i],0);
for(int i=1;i<=n;i++)add(i,i+n+1,inf,0);
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)if(i!=k)
{
for(int j=1;j<=n;j++)if(j!=k &&j!=i &&dis[i][k]!=-1&&dis[k][j]!=-1)
{
dis[i][j]=(dis[i][j]==-1)?dis[i][k]+dis[k][j]:
min(dis[i][j],dis[i][k]+dis[k][j]);
r=max(dis[i][j],r);
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(dis[i][j]!=-1)
{
add(i,j+1+n,inf,dis[i][j]);
//printf("%d %I64d %I64d\n",i,j,dis[i][j]);
}
}
}
memcpy(cop,flow,sizeof(flow));
long long temp=++r;
while (l<r)
{
long long mid=(l+r)>>1;
if(judge(mid,s,t)==1)r=mid;else l=mid+1;
}
if(r==temp)printf("-1\n");else
printf("%I64d\n",r);
return 0;
}
POJ 2391 Ombrophobic Bovines【二分 网络流】的更多相关文章
- POJ 2391 Ombrophobic Bovines (二分答案+floyd+最大流)
<题目链接> 题目大意: 给定一个有$n$个顶点和$m$条边的无向图,点$i$ 处有$A_i$头牛,点$i$ 处的牛棚能容纳$B_i$头牛,每条边有一个时间花费$t_i$(表示从一个端点走 ...
- poj 2391 Ombrophobic Bovines, 最大流, 拆点, 二分, dinic, isap
poj 2391 Ombrophobic Bovines, 最大流, 拆点, 二分 dinic /* * Author: yew1eb * Created Time: 2014年10月31日 星期五 ...
- POJ 2391 Ombrophobic Bovines (Floyd + Dinic +二分)
Ombrophobic Bovines Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11651 Accepted: 2 ...
- poj 2391 Ombrophobic Bovines(最大流+floyd+二分)
Ombrophobic Bovines Time Limit: 1000MSMemory Limit: 65536K Total Submissions: 14519Accepted: 3170 De ...
- POJ 2391 Ombrophobic Bovines
Ombrophobic Bovines Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 18623 Accepted: 4 ...
- POJ 2391 Ombrophobic Bovines(二分+拆点+最大流)
http://poj.org/problem?id=2391 题意: 给定一个无向图,点i处有Ai头牛,点i处的牛棚能容纳Bi头牛,求一个最短时间T,使得在T时间内所有的牛都能进到某一牛棚里去. 思路 ...
- POJ 2391 Ombrophobic Bovines ( 经典最大流 && Floyd && 二分 && 拆点建图)
题意 : 给出一些牛棚,每个牛棚都原本都有一些牛但是每个牛棚可以容纳的牛都是有限的,现在给出一些路与路的花费和牛棚拥有的牛和可以容纳牛的数量,要求最短能在多少时间内使得每头牛都有安身的牛棚.( 这里注 ...
- POJ 2391 Ombrophobic Bovines ★(Floyd+二分+拆点+最大流)
[题意]有n块草地,一些奶牛在草地上吃草,草地间有m条路,一些草地上有避雨点,每个避雨点能容纳的奶牛是有限的,给出通过每条路的时间,问最少需要多少时间能让所有奶牛进入一个避雨点. 和POJ2112很类 ...
- poj 2391 Ombrophobic Bovines 最短路 二分 最大流 拆点
题目链接 题意 有\(n\)个牛棚,每个牛棚初始有\(a_i\)头牛,最后能容纳\(b_i\)头牛.有\(m\)条道路,边权为走这段路所需花费的时间.问最少需要多少时间能让所有的牛都有牛棚可待? 思路 ...
随机推荐
- php,json数据传输(无刷新)
废话不说直接上关键代码: js代码: <script language="javascript"> $(".login").live('click' ...
- php传json格式给C++时乱码解决方案
今天在做给C++传json数据时,C++无法识别到中文 网上查下原因有json只支持utf-8,但是我的整个项目编码都是utf8的,没有出现过其它编码,所以问题还是抛给了C++解决,后来经一高手解答说 ...
- spoj GCJ1C09C Bribe the Prisoners
题目链接: http://www.spoj.com/problems/GCJ1C09C/ 题意: In a kingdom there are prison cells (numbered 1 to ...
- DOM编程练习(慕课网题目)
编程练习 制作一个表格,显示班级的学生信息. 要求: 1. 鼠标移到不同行上时背景色改为色值为 #f2f2f2,移开鼠标时则恢复为原背景色 #fff 2. 点击添加按钮,能动态在最后添加一行 3. 点 ...
- 成为Android高手必须掌握的8项基本要求
[1] Android操作系统概述 1. Android系统架构. 2. Android利用设计理念. 3. Android 开源知识. 4. Android 参考网站与权威信息.[2] Androi ...
- HEVC标准介绍+论文阅读笔记
脱离视频编解码.投入计算机视觉一年,这个博客也歇业一年,最近偷些时间回顾一下编解码,毕竟花费了整个研一的时间(虽然这一年基本上在上课). 之前写过几篇H.264标准的几篇介绍文章,详见:http:// ...
- 分布式技术EJB3_分库架构 - 【动力节点官网】北京Java …
分布式技术EJB3_分库架构 - [动力节点官网]北京Java … http://www.bjpowernode.com/xiazai/2220.html <程序天下--EJB JPA数据库持久 ...
- FPGA-信号边缘检测
在FPGA逻辑电路中,输入信号的边缘检测是一个常用的操作,这算是FPGA的基本功之一. 信号边缘检测应用十分广泛,例如:通信协议的时序操作,按键的检测等,都应用到按键的检测.按键的检测分为上升沿和下降 ...
- 7-Java-C(四平方和)
题目描述: 四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多4个正整数的平方和. 如果把0包括进去,就正好可以表示为4个数的平方和. 比如: 5 = 0^2 + 0^2 + 1^2 + ...
- ABAQUS学习记录1——用户子程序综述
概述 ABAQUS提供了相当丰富的单元类型,材料属性等数据库可供用户选择,但是工程问题是千变万化的,为了满足用户的特殊工程要求,ABAQUS为用户提供了强大而又灵活的用户子程序接口(USER SUBR ...