联系:http://poj.org/problem?id=2391

题意:有f个草场,每一个草场当前有一定数目的牛在吃草,下雨时它能够让一定数量的牛在这里避雨,f个草场间有m条路连接,每头牛通过一条路从一点到还有一点有一定的时间花费,如今要下雨了,农场主发出警报牛就会马上去避雨。

如今告诉每一个草场的情况。以及m条边的信息。农场主至少须要提前多久发出警报才干保证全部牛都能避雨?假设不是全部牛都能成功避雨输出-1。

思路:这道题须要拆点,是看到魏神的博客才知道的。我们把原图拆成一个二分图,避免突破最大距离限制的情况,每一个点变成两个点,即i变为i‘和i’‘,建立一个源点连接每一个i’,容量为初始每一个草场牛的数目。建立一个汇点,全部的i‘’指向汇点,容量为每一个草场能容纳的牛的数目。假设两个点i和j连接。则在i’和j‘’以及j‘和i’‘之间建一条路径。容量为INF,能够走无限多的牛。然后这道题就和之前做的一道POJ2112一样了,POJ2112不用拆点,由于它本身就是一个二分图。

接下来就是Floyd处理出随意两点间最短路径。然后二分答案。

可是这道题还没有完,我套之前的Dinic模板,TLE了。这道题最大可能的边数比POJ2112大,而Case时限一样,我手写队列。还是TLE,我再把vis数组去掉用dist取代vis功能,还是TLE,我在网上搜AC的Dinic代码,看到一个和我的差点儿相同。粘贴交了一发。TLE,无力吐槽。。。

找到了一个看上去有些修改的代码,依照它修改的地方改我自己的。219MS AC。

我看了一下。我认为基本的优化地方是这样:

1. 我之前的模板,是从源点起找遍每一条增广路进行松弛,优化算法是找到一条增广路松弛、退出,更新最大流值,再找下一条,直到更新值返回0说明已更新到头,避免了多余的搜索。

2. 假设此时的顶点已不存在增广路,将它从当前的层次网络中删除。回溯后不会再搜。

我认为这是两个优化到的地方,这么进行了优化之后效率提升非常明显!

#include<cstring>
#include<string>
#include<fstream>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cctype>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<stack>
#include<ctime>
#include<cstdlib>
#include<functional>
#include<cmath>
using namespace std;
#define PI acos(-1.0)
#define MAXN 200100
#define eps 1e-7
#define INF 0x7FFFFFFF
#define LLINF 0x7FFFFFFFFFFFFFFF
#define seed 131
#define mod 1000000007
#define ll long long
#define ull unsigned ll
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1 struct node{
int u,w,next;
}edge[100010];
int head[410],dist[410],q[410];
int aa[410],bb[410];
ll e[410][410];
int n,m,cnt,src,sink,f,p;
void add_edge(int a,int b,int c){
edge[cnt].u = b;
edge[cnt].w = c;
edge[cnt].next = head[a];
head[a] = cnt++;
}
void floyd(){
int i,j,k;
for(k=1;k<=f;k++){
for(i=1;i<=f;i++){
if(e[i][k]==LLINF) continue;
for(j=1;j<=f;j++){
if(e[i][k]+e[k][j]<e[i][j]&&e[i][k]!=LLINF&&e[k][j]!=LLINF)
e[i][j] = e[i][k] + e[k][j];
}
}
}
}
void build_graph(ll minm){
int i,j;
cnt = 0;
memset(head,-1,sizeof(head));
for(i=1;i<=f;i++){
add_edge(src,i,aa[i]);
add_edge(i,src,0);
add_edge(i+f,sink,bb[i]);
add_edge(sink,i+f,0);
for(j=1;j<=f;j++){
if(e[i][j]<=minm){
add_edge(i,j+f,INF);
add_edge(j+f,i,0);
}
}
}
}
bool bfs(){
int i,j;
memset(dist,-1,sizeof(dist));
int f = 0, t = 1;
q[0] = src;
dist[src] = 1;
while(f<t){
int u = q[f++];
for(i=head[u];i!=-1;i=edge[i].next){
int v = edge[i].u;
if(dist[v]==-1&&edge[i].w){
dist[v] = dist[u] + 1;
q[t++] = v;
}
}
}
if(dist[sink]!=-1) return true;
return false;
}
int dfs(int u,int delta){
int i,j;
int dd;
if(u==sink) return delta;
for(i=head[u];i!=-1;i=edge[i].next){
if(dist[edge[i].u]==dist[u]+1&&edge[i].w&&(dd = dfs(edge[i].u,min(delta,edge[i].w)))){
edge[i].w -= dd;
edge[i^1].w += dd;
return dd;
}
}
dist[u] = -1;
return 0;
}
int main(){
int i,j;
int ta,tb,tc;
int cow;
scanf("%d%d",&f,&p);
n = 2 * f + 2;
src = 0;
sink = 2 * f + 1;
cow = 0;
for(i=1;i<=f;i++){
scanf("%d%d",&aa[i],&bb[i]);
cow += aa[i];
}
for(i=0;i<=f;i++){
for(j=0;j<=f;j++)
e[i][j] = LLINF;
e[i][i] = 0;
}
for(i=0;i<p;i++){
scanf("%d%d%d",&ta,&tb,&tc);
if(tc<e[ta][tb]) e[ta][tb] = e[tb][ta] = tc;
}
floyd();
ll mid,l = 0,r = 0;
for(i=1;i<=f;i++){
for(j=1;j<=f;j++){
if(e[i][j]!=LLINF) r = max(e[i][j],r);
}
}
int sum;
ll ans = -1;
while(l<=r){
mid = (l+r)>>1LL;
//cout<<l<<" "<<r<<endl;
sum = 0;
build_graph(mid);
while(bfs()){
while(1){
int ttt = dfs(src,INF);
if(!ttt) break;
sum += ttt;
}
}
if(sum==cow){
ans = mid;
r = mid-1;
}
else l = mid + 1;
}
printf("%I64d\n",ans);
return 0;
}

版权声明:本文博主原创文章。博客,未经同意不得转载。

POJ--2391--Ombrophobic Bovines【分割点+Floyd+Dinic优化+二分法答案】最大网络流量的更多相关文章

  1. POJ 2391 Ombrophobic Bovines (Floyd + Dinic +二分)

    Ombrophobic Bovines Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11651   Accepted: 2 ...

  2. POJ 2391 Ombrophobic Bovines(Floyd+二分+最大流)

    题目链接 题意:农场有F(1 <= F <= 200)片草地用于放牛,这些草地有P(1 <= P <= 1500)连接,农场的草地上有一些避雨点,奶牛们可以在避雨点避雨,但是避 ...

  3. poj 2391 Ombrophobic Bovines, 最大流, 拆点, 二分, dinic, isap

    poj 2391 Ombrophobic Bovines, 最大流, 拆点, 二分 dinic /* * Author: yew1eb * Created Time: 2014年10月31日 星期五 ...

  4. poj 2391 Ombrophobic Bovines(最大流+floyd+二分)

    Ombrophobic Bovines Time Limit: 1000MSMemory Limit: 65536K Total Submissions: 14519Accepted: 3170 De ...

  5. POJ 2391 Ombrophobic Bovines

    Ombrophobic Bovines Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18623   Accepted: 4 ...

  6. POJ 2391 Ombrophobic Bovines (二分答案+floyd+最大流)

    <题目链接> 题目大意: 给定一个有$n$个顶点和$m$条边的无向图,点$i$ 处有$A_i$头牛,点$i$ 处的牛棚能容纳$B_i$头牛,每条边有一个时间花费$t_i$(表示从一个端点走 ...

  7. POJ 2391 Ombrophobic Bovines ( 经典最大流 && Floyd && 二分 && 拆点建图)

    题意 : 给出一些牛棚,每个牛棚都原本都有一些牛但是每个牛棚可以容纳的牛都是有限的,现在给出一些路与路的花费和牛棚拥有的牛和可以容纳牛的数量,要求最短能在多少时间内使得每头牛都有安身的牛棚.( 这里注 ...

  8. POJ 2391 Ombrophobic Bovines ★(Floyd+二分+拆点+最大流)

    [题意]有n块草地,一些奶牛在草地上吃草,草地间有m条路,一些草地上有避雨点,每个避雨点能容纳的奶牛是有限的,给出通过每条路的时间,问最少需要多少时间能让所有奶牛进入一个避雨点. 和POJ2112很类 ...

  9. POJ 2391 Ombrophobic Bovines(二分+拆点+最大流)

    http://poj.org/problem?id=2391 题意: 给定一个无向图,点i处有Ai头牛,点i处的牛棚能容纳Bi头牛,求一个最短时间T,使得在T时间内所有的牛都能进到某一牛棚里去. 思路 ...

随机推荐

  1. pygame各个模块概述

    在pygame中,有很多模块,每个模块对应着不同的功能,如果我们知道这些模块是做什么的,那么,对我们的游戏开发会起到关键性的作用. 我们就说说pygame中的各个模块吧!!! #pygame modu ...

  2. Qt Creator 代码自动补全设置

    Qt Creator具有自己的代码补全快捷键[Ctrl]+[Space] 但是在使用过程中,效果不明显,或者没有效果.可能是与输入法的切换冲突了.因此可以通过设置,避免这个问题. 解决方法: 1.打开 ...

  3. Socket编程实践(13) --UNIX域名协议

    UNIX域名协议 UNIX域套接字与TCP相比, 在同一台主机上, UNIX域套接字更有效率, 差点儿是TCP的两倍(因为UNIX域套接字不须要经过网络协议栈,不须要打包/拆包,计算校验和,维护序号和 ...

  4. 浅谈新一代Android操作系统Android L

    今天早一些的时候,Google公布了新一代Android操作系统Android L.让我很意外的是命名规则的变化,之前外界纷纷推測会叫Android5.0,同一时候会给一个甜品的名字命名.由于Andr ...

  5. profile与bashrc

    /etc/profile./etc/bashrc 是系统全局环境变量设定 ~/.profile,~/.bashrc用户家文件夹下的私有环境变量设定 当登入系统时候获得一个shell进程时.其读取环境设 ...

  6. Nim博弈游戏

    给定n堆石子,每次每人能从一堆石子中取若干个石子(不能不取),最后不能取石子者败 对于这个游戏,我们要判断的是,给定局势下,先手者胜还是败 设先手胜的局势为N-postion,先手败的局势为P-pos ...

  7. 【译】手动处理Team Foundation Server 2010 数据仓库和分析服务数据库

    原贴地址:Manually Processing the Team Foundation Server 2010 Data Warehouse and Analysis Services Databa ...

  8. android 编译调用C代码

    博客地址:www.zalezone.cn 前言 需求来源 这几天帮别人做一个简单的androidclient,也没什么功能,主要就是调用C代码来对手机的Wifi网络进行设置.于是也就引出了技术难点所在 ...

  9. C语言中的static 具体分析

    google了近三页的关于C语言中static的内容,发现可用的信息非常少,要么长篇大论不知所云要么在关键之处几个字略过,对于想挖掘底层原理的刚開始学习的人来说參考性不是非常大.所以,我这篇博文博採众 ...

  10. 大约apache 2.4.X虚拟主机配置问题的版本号后,

    重装系统,习惯性下载最新的wamp2.5,在各种配置,然后一切正常反应.数据库,代码. 然后打开浏览器,尼嘛,幸运的是,昨天,与虚拟域,其实403该. apache error log的信息是:AH0 ...