POJ2391 Ombrophobic Bovines(网络流)(拆点)
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 18205 | Accepted: 3960 |
Description
The farm has F (1 <= F <= 200) fields on which the cows graze.
A set of P (1 <= P <= 1500) paths connects them. The paths are
wide, so that any number of cows can traverse a path in either
direction.
Some of the farm's fields have rain shelters under which the cows
can shield themselves. These shelters are of limited size, so a single
shelter might not be able to hold all the cows. Fields are small
compared to the paths and require no time for cows to traverse.
Compute the minimum amount of time before rain starts that the siren must be sounded so that every cow can get to some shelter.
Input
* Lines 2..F+1: Two space-separated integers that describe a field.
The first integer (range: 0..1000) is the number of cows in that field.
The second integer (range: 0..1000) is the number of cows the shelter
in that field can hold. Line i+1 describes field i.
* Lines F+2..F+P+1: Three space-separated integers that describe a
path. The first and second integers (both range 1..F) tell the fields
connected by the path. The third integer (range: 1..1,000,000,000) is
how long any cow takes to traverse it.
Output
Line 1: The minimum amount of time required for all cows to get under a
shelter, presuming they plan their routes optimally. If it not possible
for the all the cows to get under a shelter, output "-1".
Sample Input
3 4
7 2
0 4
2 6
1 2 40
3 2 70
2 3 90
1 3 120
Sample Output
110
Hint
In 110 time units, two cows from field 1 can get under the shelter
in that field, four cows from field 1 can get under the shelter in field
2, and one cow can get to field 3 and join the cows from that field
under the shelter in field 3. Although there are other plans that will
get all the cows under a shelter, none will do it in fewer than 110 time
units.
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <time.h>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#define inf 0x3f3f3f3f
#define mod 10000
typedef long long ll;
using namespace std;
const int N=;
const int M=;
int power(int a,int b,int c){int ans=;while(b){if(b%==){ans=(ans*a)%c;b--;}b/=;a=a*a%c;}return ans;}
struct man
{
int c,f;
}w[N][N];
int dis[N],n,m;
int t,cnt,maxn=,ans;
ll cost[N][N];
int c[N],f[N];
bool bfs()
{
queue<int>q;
memset(dis,,sizeof(dis));
q.push();
dis[]=;
while(!q.empty() && !dis[t]){
int v=q.front();q.pop();
for(int i=;i<=t;i++){
//if(i==t)printf("w[i][t].c=%d\n",w[i][t].c);
if(!dis[i]&&w[v][i].c>w[v][i].f){
q.push(i);
dis[i]=dis[v]+;
}
}
}
return dis[t]!=;
}
int dfs(int cur,int cp)
{
if(cur==t||cp==)return cp;
int tmp=cp,tt;
for(int i=;i<=t;i++){
if(dis[i]==dis[cur]+ &&w[cur][i].c>w[cur][i].f){
tt=dfs(i,min(w[cur][i].c-w[cur][i].f,tmp));
w[cur][i].f+=tt;
w[i][cur].f-=tt;
tmp-=tt;
}
}
return cp-tmp;
}
void dinic()
{
ans=;
while(bfs())ans+=dfs(,inf);
}
void Floyd()
{
for(int k=;k<=n;k++){
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
if(i!=j)cost[i][j]=min(cost[i][j],cost[i][k]+cost[k][j]);
else cost[i][j]=;
}
}
}
}
void Build(ll x)
{
memset(w,,sizeof(w));
for(int i=;i<=n;i++)w[][i].c=c[i];
for(int i=n+;i<=*n;i++)w[i][t].c=f[i-n];
for(int i=;i<=n;i++)for(int j=n+;j<t;j++)if(cost[i][j-n]<=x)w[i][j].c=inf;
}
int main(){
cin>>n>>m;
memset(cost,inf,sizeof(cost));
ll l=,r=;
t=n*+;
for(int i=;i<=n;i++){cin>>c[i]>>f[i];maxn+=c[i];}
int a,b;ll val;
while(m--){
cin>>a>>b>>val;
r+=val;
cost[a][b]=cost[b][a]=min(cost[a][b],val);
}
Floyd();
bool flag=false;
while(l<r){
ll mid=(l+r)/;
Build(mid);
dinic();
if(ans>=maxn)r=mid,flag=true;
else l=mid+;
}
if(flag) cout<<r<<endl;
else puts("-1");
return ;
}
AC代码
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <time.h>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#define inf 0x3f3f3f3f
#define mod 10000
typedef long long ll;
using namespace std;
const int N=;
const int M=;
int power(int a,int b,int c){int ans=;while(b){if(b%==){ans=(ans*a)%c;b--;}b/=;a=a*a%c;}return ans;}
struct man
{
int c,f;
}w[N][N];
int dis[N],n,m;
int t,cnt,maxn=,ans;
ll cost[N][N];
int c[N],f[N];
bool bfs()
{
queue<int>q;
memset(dis,,sizeof(dis));
q.push();
dis[]=;
while(!q.empty() && !dis[t]){
int v=q.front();q.pop();
for(int i=;i<=t;i++){
//if(i==t)printf("w[i][t].c=%d\n",w[i][t].c);
if(!dis[i]&&w[v][i].c>w[v][i].f){
q.push(i);
dis[i]=dis[v]+;
}
}
}
return dis[t]!=;
}
int dfs(int cur,int cp)
{
if(cur==t||cp==)return cp;
int tmp=cp,tt;
for(int i=;i<=t;i++){
if(dis[i]==dis[cur]+ &&w[cur][i].c>w[cur][i].f){
tt=dfs(i,min(w[cur][i].c-w[cur][i].f,tmp));
w[cur][i].f+=tt;
w[i][cur].f-=tt;
tmp-=tt;
}
}
return cp-tmp;
}
void dinic()
{
ans=;
while(bfs())ans+=dfs(,inf);
}
void Floyd()
{
for(int k=;k<=n;k++){
for(int i=;i<=n;i++){
if(cost[i][k]!=inf){
for(int j=;j<=n;j++){
cost[i][j]=min(cost[i][j],cost[i][k]+cost[k][j]);
}
}
}
}
}
void Build(ll x)
{
memset(w,,sizeof(w));
for(int i=;i<=n;i++)w[][i].c=c[i];
for(int i=n+;i<=*n;i++)w[i][t].c=f[i-n];
for(int i=;i<=n;i++)for(int j=n+;j<t;j++)if(cost[i][j-n]<=x)w[i][j].c=inf;
}
int main(){
cin>>n>>m;
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
if(i==j)cost[i][j]=;
else cost[i][j]=inf;
}
}
ll l=,r=;
t=n*+;
for(int i=;i<=n;i++){cin>>c[i]>>f[i];maxn+=c[i];}
int a,b;ll val;
while(m--){
cin>>a>>b>>val;
r+=val;
cost[a][b]=cost[b][a]=min(cost[a][b],val);
}
Floyd();
bool flag=false;
while(l<r){
ll mid=(l+r)/;
Build(mid);
dinic();
if(ans>=maxn)r=mid,flag=true;
else l=mid+;
}
if(flag) cout<<r<<endl;
else puts("-1");
return ;
}
上面的是WA代码,不知道为什么错了。
POJ2391 Ombrophobic Bovines(网络流)(拆点)的更多相关文章
- POJ2391 Ombrophobic Bovines 网络流拆点+二分+floyed
题目链接: id=2391">poj2391 题意: 有n块草地,每块草地上有一定数量的奶牛和一个雨棚,并给出了每一个雨棚的容(牛)量. 有m条路径连接这些草地 ,这些路径是双向的, ...
- poj2391 Ombrophobic Bovines 拆点+二分法+最大流
/** 题目:poj2391 Ombrophobic Bovines 链接:http://poj.org/problem?id=2391 题意:有n块区域,第i块区域有ai头奶牛,以及一个可以容纳bi ...
- POJ2391 Ombrophobic Bovines
Ombrophobic Bovines Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 19359 Accepted: 4 ...
- poj2391 Ombrophobic Bovines 题解
http://poj.org/problem?id=2391 floyd+网络流+二分 题意:有一个有向图,里面每个点有ai头牛,快下雨了牛要躲进雨棚里,每个点有bi个雨棚,每个雨棚只能躲1头牛.牛可 ...
- POJ 2391 Ombrophobic Bovines 网络流 建模
[题目大意]给定一个无向图,点i处有Ai头牛,点i处的牛棚能容纳Bi头牛,求一个最短时间T使得在T时间内所有的牛都能进到某一牛棚里去.(1 <= N <= 200, 1 <= M & ...
- poj 2391 Ombrophobic Bovines, 最大流, 拆点, 二分, dinic, isap
poj 2391 Ombrophobic Bovines, 最大流, 拆点, 二分 dinic /* * Author: yew1eb * Created Time: 2014年10月31日 星期五 ...
- POJ2391:Ombrophobic Bovines(最大流+Floyd+二分)
Ombrophobic Bovines Time Limit: 1000MSMemory Limit: 65536K Total Submissions: 21660Accepted: 4658 题目 ...
- POJ 2391 Ombrophobic Bovines (Floyd + Dinic +二分)
Ombrophobic Bovines Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11651 Accepted: 2 ...
- POJ 2391 Ombrophobic Bovines
Ombrophobic Bovines Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 18623 Accepted: 4 ...
随机推荐
- Ubuntu根目录下各文件的功能介绍
http://jingyan.baidu.com/article/afd8f4de55189c34e286e9e6.html
- C++全局变量的声明和定义
(1)编译单元(模块) 在VC或VS上编写完代码,点击编译按钮准备生成exe文件时,编译器做了两步工作: 第一步,将每个.cpp(.c)和相应的.h文件编译成obj文件: 第二步,将工程中所有 ...
- ognl表达式root中取值顺序
不加#,先从栈顶取,如果没有(是没有这个属性而不是这个属性没有值),再往下取. 如果栈顶和非栈顶的对象拥有同一个属性名称,想直接取非栈顶的属性可以在ognl中用#root[i].属性名,可以取到属性的 ...
- char 数组和 int 之间转化
上周工作结束,来到斯凯网络也将近半个月来. 没有新人的感念,最多的是将自己当作一个战士. 废话不多说,直接入正题,在没有仔细考虑问题之前我们总会 觉得:这尼玛的有毛线难度啊,不就是一个 int 转为c ...
- HTML--10Jquery
在<网页制作Dreamweaver(悬浮动态分层导航)>中,运用到了jQuery的技术,轻松实现了菜单的下拉.显示.隐藏的效果,不必再用样式表一点点地修改,省去了很多麻烦,那么jQuery ...
- hdu1506 dp
//Accepted 1428 KB 62 ms // #include <cstdio> #include <cstring> #include <iostream&g ...
- 从问题看本质:socket到底是什么(问答式)? .
转自:http://blog.csdn.net/yeyuangen/article/details/6799575 一.问题的引入——socket的引入是为了解决不同计算机间进程间通信的问题 1.so ...
- postgreSQL初步使用总结
一.安装 postgreSQL安装完成后会默认生成一个名为postgres的用户和一个名为postgres的数据库.可以使用自带的psql.exe工具来登录.其帮助信息如下 连接到本地的postgre ...
- Tomcat容器运行struts2+spring+mybatis架构的java web应用程序简单分析
1.具体的环境为 MyEclipse 8.5以及自带的tomcat spring3.0.5 struts2.3.15.1 mybatis3.0.5 2.想弄明白的一些问题 tomcat集成spring ...
- (spring-第13回【IoC基础篇】)PropertyEditor(属性编辑器)--实例化Bean的第五大利器
上一篇讲到JavaBeans的属性编辑器,编写自己的属性编辑器,需要继承PropertyEditorSupport,编写自己的BeanInfo,需要继承SimpleBeanInfo,然后在BeanIn ...