题目链接:

id=2391">poj2391

题意:

有n块草地,每块草地上有一定数量的奶牛和一个雨棚,并给出了每一个雨棚的容(牛)量.

有m条路径连接这些草地  ,这些路径是双向的,并且非常宽敞,能够容下无限条牛并排走, 给出经过每条路径所须要消耗的时间

问:全部牛都到达雨棚下的最小时间

解题思路:

类似    牛与挤奶器的问题

http://blog.csdn.net/axuan_k/article/details/45920969  已给出基本思路

与上题最大的差别是:

草地既连接源点,也连接汇点  并且草地与草地之间的路径是双向的.而网络流中的应该是单向的,

这就须要我们拆点了: 把每块草地拆成两个点 i和n+i;且i到n+i的距离为0 。仅仅连接(1~n)->(n+1~2n)的边

这样,就和上题解法一样了

要注意的是: 时间可能大于 int;距离初值应赋为long long的无穷大

代码:

#include <iostream>
#include <cstring>
#include<cstdio>
#define LL long long
#include <queue>
const int MAXN =1050;
const int MAXM=440020;
const int INF=0x3f3f3f3f;
using namespace std;
struct Edge
{
int to,cap,flow,next;
} edge[MAXM];
int head[MAXN],tot,gap[MAXN],d[MAXN],cur[MAXN],que[MAXN],p[MAXN]; void init()
{
tot=0;
memset(head,-1,sizeof(head));
} void addedge(int u,int v,int c,int f)
{
edge[tot]=(Edge)
{
v,c,f,head[u]
};
head[u] = tot++;
edge[tot]=(Edge)
{
u,c,c,head[v]
};
head[v] = tot++;
} int isap(int source,int sink,int N)
{
memset(gap,0,sizeof(gap));
memset(d,0,sizeof(d));
memcpy(cur,head,sizeof(head));
int top = 0,x = source,flow = 0;
while(d[source] < N)
{
if(x == sink)
{
int Min = INF,inser=0;
for(int i = 0; i < top; ++i)
{
if(Min > edge[p[i]].cap - edge[p[i]].flow)
{
Min = edge[p[i]].cap - edge[p[i]].flow;
inser = i;
}
}
for(int i = 0; i < top; ++i)
{
edge[p[i]].flow += Min;
edge[p[i]^1].flow -= Min;
}
if(Min!=INF) flow += Min;
top = inser;
x = edge[p[top]^1].to;
continue;
}
int ok = 0;
for(int i = cur[x]; i != -1; i = edge[i].next)
{
int v = edge[i].to;
if(edge[i].cap > edge[i].flow && d[v]+1 == d[x])
{
ok = 1;
cur[x] = i;
p[top++] = i;
x = edge[i].to;
break;
}
}
if(!ok)
{
int Min = N;
for(int i = head[x]; i != -1; i = edge[i].next)
{
if(edge[i].cap > edge[i].flow && d[edge[i].to] < Min)
{
Min = d[edge[i].to];
cur[x] = i;
}
}
if(--gap[d[x]] == 0) break;
gap[d[x] = Min+1]++;
if(x != source) x = edge[p[--top]^1].to;
}
}
return flow;
} LL dis[MAXN][MAXN];
int v[MAXN][2];
void build(int n,LL value)
{
init();
for(int i=1; i<=n; i++)
{
addedge(0,i,v[i][0],0);
addedge(n+i,2*n+1,v[i][1],0);
}
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
if(dis[i][j]<=value)
addedge(i,n+j,INF,0);
} int main()
{
// freopen("in.txt","r",stdin);
int n,m,a,b;
LL c;
int sum=0,sum2=0;
scanf("%d%d",&n,&m);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
if(i != j) dis[i][j] = 2000000000000LL; //初始化long long的无穷大
else dis[i][j] = 0;
for(int i=1; i<=n; i++)
{
scanf("%d%d",&v[i][0],&v[i][1]);
sum+=v[i][0];
sum2+=v[i][1];
}
for(int i=1; i<=m; i++)
{
scanf("%d%d%lld",&a,&b,&c);
if(dis[a][b]>c) //选最小的
dis[a][b]=dis[b][a]=c;
}
if(sum>sum2)
{
printf("-1\n");
return 0;
}
for(int k=1; k<=n; k++)
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
if(dis[i][k]+dis[k][j]<dis[i][j])
dis[i][j]=dis[k][j]+dis[i][k]; LL ans=-1,l=0,r=1e12,mid; //注意这个r右边界 一定要比dis数组的初值小
int d;
while(l<=r)
{
mid=(l+r)>>1;
build(n,mid);
d=isap(0,2*n+1,2*n+2);
if(d==sum)
{
ans=mid;
r=mid-1;
}
else l=mid+1;
}
printf("%lld\n",ans);
return 0;
}

POJ2391 Ombrophobic Bovines 网络流拆点+二分+floyed的更多相关文章

  1. poj2391 Ombrophobic Bovines 拆点+二分法+最大流

    /** 题目:poj2391 Ombrophobic Bovines 链接:http://poj.org/problem?id=2391 题意:有n块区域,第i块区域有ai头奶牛,以及一个可以容纳bi ...

  2. POJ2391 Ombrophobic Bovines(网络流)(拆点)

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

  3. POJ2391:Ombrophobic Bovines(最大流+Floyd+二分)

    Ombrophobic Bovines Time Limit: 1000MSMemory Limit: 65536K Total Submissions: 21660Accepted: 4658 题目 ...

  4. POJ2391 Ombrophobic Bovines

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

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

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

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

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

  7. poj2391 Ombrophobic Bovines 题解

    http://poj.org/problem?id=2391 floyd+网络流+二分 题意:有一个有向图,里面每个点有ai头牛,快下雨了牛要躲进雨棚里,每个点有bi个雨棚,每个雨棚只能躲1头牛.牛可 ...

  8. POJ 2391 Ombrophobic Bovines 网络流 建模

    [题目大意]给定一个无向图,点i处有Ai头牛,点i处的牛棚能容纳Bi头牛,求一个最短时间T使得在T时间内所有的牛都能进到某一牛棚里去.(1 <= N <= 200, 1 <= M & ...

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

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

随机推荐

  1. 杂项-Java:EL表达式

    ylbtech-杂项-Java:EL表达式 EL(Expression Language) 是为了使JSP写起来更加简单.表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提 ...

  2. PCB MS SQL 小写转大写

    由于SQL Server允许为小写进入 ,导致数据库中存在小写,在数据集成到MES或ERP时报错,Oracle要求大写导致, 需转换为大写,可通过以下语句,查询所有小写数据,再更新.

  3. Python 45 长度及颜色单位 、字体样式 、文本样式 、背景样式 、css基础选择器

    一:长度及颜色单位   长度单位       px(像素)        in(英寸)       pt(点),一个标准的长度单位,1pt = 1/72in       mm(毫米)       cm ...

  4. Spark2.0.2+Zeppelin0.6.2 环境搭建 初探

    0.抱怨与其他(此部分与标题没有太多联系): 首先一点想说的是版本问题,为什么标题我会写清楚版本号呢!原因就是版本不对真的很会坑人. 就在写这篇博客的同一天,我还写了另一篇,是 Hadoop2.7.3 ...

  5. ACM_Exponentiation

    Exponentiation Time Limit: 2000/1000ms (Java/Others) Problem Description: Problems involving the com ...

  6. mac下配置nginx

    nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器,下面我们来了解下nginx的用法. 安装nginx 使用brew安装nginx brew install ...

  7. Java常见错误整理(一)

    1.配置完Java环境变量之后,仍然不能使用java命令. 解决方法: 如果是Windows10系统出现此问题,是因为个别Windows10系统不识别“JAVA_HOME”环境变量,将path中所有的 ...

  8. sql server 还原数据库,数据库提示正在还原中的处理办法

      还原数据库时,提示还原成功,可是数据库列表中该数据库显示正在还原中: 执行此命令即可: RESTORE DATABASE EnterPriseBuilding WITH RECOVERY 了解SQ ...

  9. 关于c# winform使用FidderCore.dll 遇到的一些问题,请求支援

    小弟最近再研究winform用fidder抓取包的过程.开始都很顺利,并且成功开启了代理网络.同时手机也设置代理,并且手机可以上网,而且电脑也能抓到手机的请求. 但是遇到两个问题. 1.,这里的关闭代 ...

  10. 机器学习:随机森林RF-OBB袋外错误率

    文章讲解比较详细,且有Python代码,可以作为有用的参考. 原文链接:http://blog.csdn.net/zhufenglonglove/article/details/51785220  参 ...