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;
}
POJ 2391 Ombrophobic Bovines 网络流 建模的更多相关文章
- 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
Ombrophobic Bovines Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 18623 Accepted: 4 ...
- poj 2391 Ombrophobic Bovines(最大流+floyd+二分)
Ombrophobic Bovines Time Limit: 1000MSMemory Limit: 65536K Total Submissions: 14519Accepted: 3170 De ...
- POJ 2391 Ombrophobic Bovines【二分 网络流】
题目大意:F个草场,P条道路(无向),每个草场初始有几头牛,还有庇护所,庇护所有个容量,每条道路走完都有时间,问所有奶牛都到庇护所最大时间最小是多少? 思路:和POJ2112一样的思路,二分以后构建网 ...
- 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 (最大流)
实际上是求最短的避雨时间. 首先将每个点拆成两个,一个连接源点,一个连接汇点,连接源点的点的容量为当前单的奶牛数,连接汇点的点为能容纳的奶牛数. floyd求任意两点互相到达的最短时间,二分最长时间, ...
随机推荐
- 开关电源ac-dc推荐电路
在使用AC-DC电源模块SA系列时,如果碰到对模块的输出纹波噪声要求较高或对EMC要求严格的场合,应对模块进行必要的滤波处理使到满足不同环境的特殊要求,以下推荐一滤波电路供参考: 图中各元件的说明:1 ...
- easy flash &easy log
EASY FLASH: ENV 快速保存产品参数(k-v型no-sql数据库存储),支持 写平衡(磨损平衡) 及 掉电保护 功能 EasyFlash不仅能够实现对产品的 设定参数 或 运行日志 等信息 ...
- 运营商如何关闭2G、3G网络?这事儿得从小灵通说起
5G时代即将全面开启,主流声音是对未来的无限畅想--5G将带来翻天覆地的变化.不过凡事都有利弊两面性,5G作为新生事物固然大有可为,但不可避免地会对旧事物造成巨大冲击.除了会影响很多跟不上潮流发展的行 ...
- 图解jvm--(四)内存模型
内存模型 java 内存模型 很多人将[java 内存结构]与[java 内存模型]傻傻分不清,[java 内存模型]是 Java Memory Model(JMM)的意思. 简单的说,JMM 定义了 ...
- HTML常用标签效果展示
HTML常用标签效果展示 一.文本效果 段落1---收到了开发建设看来得更加快乐圣诞节福利肯定是减肥的路上苏里科夫就是打开了飞机都是风口浪尖上的疯狂了大煞风景圣诞快乐的索科洛夫几点上课了关键是低空掠过 ...
- vue学习笔记:vue的认识与特点与获取
Vue了解 Vue:读作 view Vue是一个渐进式框架 与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计. Vue 的核心库只关注视图层,并且非常容易学习,非常容易与其它库或已有项目整 ...
- Chrome浏览器 HTML5看视频卡顿
定位问题 起初以为是flash的问题,但是在B站看视频,由html播放改为flash播放后,卡顿现象消失 将相同的B站视频,用edge播放,也无卡顿现象 可以确定,问题出在chrome身上 解决方法 ...
- 十 Spring的AOP的底层实现:JDK动态代理和Cglib动态代理
SpringAOP底层的实现原理: JDK动态代理:只能对实现了接口的类产生代理.(实现接口默认JDK动态代理,底层自动切换) Cglib动态代理(类似Javassist第三方的代理技术):对没有实现 ...
- 1004 Counting Leaves (30分) DFS
1004 Counting Leaves (30分) A family hierarchy is usually presented by a pedigree tree. Your job is ...
- 含有namespace的类型如何访问
下图中包含的String类型,如果想要在别的文件中去访问的话: 1)需要include"ApiClient.hpp" 2)需要使用oatpp::web::client::ApiCl ...