题意:F块草坪,上面有n头牛,可以容纳m个牛遮雨。将草坪一份为2,成为二部图。

对于此题,和poj2112很像,只是2112很明显的二部图。这道题就开始敲,但是建图遇到问题,草坪的2个值怎么处理,于是将1个草坪分成2分,一份与源点相连,值为牛的个数,

另一份与汇点相连表示可以留下多少牛,由于是一个草坪,所以这两份之间相连,容量无穷大。然后对于能够相通的2块草坪,由当前块草坪左边部分,向相连的连(前提时间小于二分的时间),容量无穷。二分答案。

#include<stdio.h>
#include<string.h>
#include<queue>
#define maxn 600
#define INF 10000000000000
#define LL __int64
using namespace std;
int vis[maxn],n,m,c[maxn],f[maxn],fn;
LL map[maxn][maxn],dis[maxn][maxn];
LL min(LL x,LL y)
{return x<y?x:y;}
LL max(LL x,LL y)
{return x>y?x:y;}
void init()
{
int i,j;
for(i=;i<=fn;i++)
{
for(j=;j<=fn;j++)
{
if(i==j)
dis[i][j]=;
else
dis[i][j]=INF;
}
}
}
void floyd()
{
int i,j,k;
for(k=;k<=fn;k++)
for(i=;i<=fn;i++)
for(j=;j<=fn;j++)
{
if(dis[i][j]>dis[i][k]+dis[k][j])
dis[i][j]=dis[i][k]+dis[k][j];
}
/*for(i=1;i<=fn;i++)
{
for(j=1;j<=fn;j++)
{
printf("%d ",dis[i][j]);
}
printf("\n");
}*/
}
void makemap(LL maxval)
{
int i,j;
memset(map,,sizeof(map));
for(i=;i<=fn;i++)
{
map[][i]=c[i];
}
for(i=;i<=fn;i++)
map[i+fn][n+]=f[i];
for(i=;i<=fn;i++)
map[i][i+fn]=INF;
for(i=;i<=fn;i++)
{
for(j=;j<=fn;j++)
{
if(i==j)
continue;
if(dis[i][j]<=maxval)
{
map[i][j+fn]=INF;
}
}
}
/*for(i=0;i<=n+1;i++)
{
for(j=0;j<=n+1;j++)
{
printf("%d ",map[i][j]);
}
printf("\n");
}*/
}
int BFS()
{
int i,j;
queue<int>q;
memset(vis,-,sizeof(vis));
vis[]=;
q.push();
while(!q.empty())
{
int t=q.front();
q.pop();
for(i=;i<=n+;i++)
{
if(vis[i]<&&map[t][i])
{
vis[i]=vis[t]+;
q.push(i);
}
}
}
if(vis[n+]>)
return ;
return ;
}
LL dfs(int u,LL low)
{
int i,j;
LL a;
if(u==n+)
return low;
for(i=;i<=n+;i++)
{
if(vis[i]==vis[u]+&&map[u][i])
{
a=(LL)dfs(i,min(low,map[u][i]));
if(!a)continue;
map[u][i]-=a;
map[i][u]+=a;
return a;
}
}
return ;
}
int main()
{
int i,j,num;
LL maxval;
while(scanf("%d%d",&fn,&m)!=EOF)
{
num=;
maxval=;
for(i=;i<=fn;i++)
{
scanf("%d%d",&c[i],&f[i]);
num+=c[i];
}
n=fn*;
init();
for(i=;i<m;i++)
{
LL x,y,z;
scanf("%I64d %I64d %I64d",&x,&y,&z);
if(dis[x][y]>z)
{
dis[y][x]=z;
dis[x][y]=z;
}
}
floyd();
for(i=;i<=fn;i++)
{
for(j=;j<=fn;j++)
{
if(dis[i][j]!=INF)
maxval=max(maxval,dis[i][j]);
}
}
LL l=,r=maxval,ans=-;
while(l<=r)
{
LL ret=;
LL mid=(l+r)/;
makemap(mid);
while(BFS())
{
while()
{
LL a=dfs(,INF);
if(!a)break;
ret+=a;
}
}
//printf("%d ",mid);
if(ret>=num)
{
ans=mid;
r=mid-;
}
else
l=mid+;
}
printf("%I64d\n",ans);
}
}

poj2391 最大流+拆点的更多相关文章

  1. poj2391 最大流+拆点+二分答案+Floyd

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

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

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

  3. poj 3498 March of the Penguins(最大流+拆点)

    题目大意:在南极生活着一些企鹅,这些企鹅站在一些冰块上,现在要让这些企鹅都跳到同一个冰块上.但是企鹅有最大的跳跃距离,每只企鹅从冰块上跳走时会给冰块造成损害,因此企鹅跳离每个冰块都有次数限制.找出企鹅 ...

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

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

  5. hdu4289 最小割最大流 (拆点最大流)

    最小割最大流定理:(参考刘汝佳p369)增广路算法结束时,令已标号结点(a[u]>0的结点)集合为S,其他结点集合为T=V-S,则(S,T)是图的s-t最小割. Problem Descript ...

  6. BZOJ-1877 晨跑 最小费用最大流+拆点

    其实我是不想做这种水题的QWQ,没办法,剧情需要 1877: [SDOI2009]晨跑 Time Limit: 4 Sec Memory Limit: 64 MB Submit: 1704 Solve ...

  7. BZOJ-1070 修车 最小费用最大流+拆点+略坑建图

    1070: [SCOI2007]修车 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 3624 Solved: 1452 [Submit][Status] ...

  8. hdu 4289 最大流拆点

    大致题意:     给出一个又n个点,m条边组成的无向图.给出两个点s,t.对于图中的每个点,去掉这个点都需要一定的花费.求至少多少花费才能使得s和t之间不连通. 大致思路:     最基础的拆点最大 ...

  9. 洛谷 P2764 最小路径覆盖问题【最大流+拆点+路径输出】

    题目链接:https://www.luogu.org/problemnew/show/P2764 题目描述 «问题描述: 给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V ...

随机推荐

  1. 高性能非阻塞 Web 服务器 Undertow

    Undertow 简介 Undertow是一个用java编写的.灵活的.高性能的Web服务器,提供基于NIO的阻塞和非阻塞API. Undertow的架构是组合式的,可以通过组合各种小型的目的单一的处 ...

  2. SecondaryNameNode 理解

    NameNode将对文件系统的改动追加保存到本地文件系统上的一个日志文件(edits).当一个NameNode启动时,它首先从一个映像文件(fsimage)中读取HDFS的状态,接着应用日志文件中的e ...

  3. https://vjudge.net/problem/2198220/origin

    https://vjudge.net/problem/2198220/origin枚举等差数列第一个和第二个,然后二分确定数列后面是否存在,复杂度比较玄学,卡过了. #include<iostr ...

  4. 基于bootstrap框架在ie8以下,兼容媒体查询[css样式]

    <style type="text/css"> /*基于bootstrap框架在ie8以下,兼容媒体查询*/ .row [class^="col-" ...

  5. android 数据库存取图片

    Android数据库中存取图片通常使用两种方式,一种是保存图片所在路径,二是将图片以二进制的形式存储(sqlite3支持BLOB数据类型).对于两种方法的使用,好像第二种方法不如第一种方法更受程序员欢 ...

  6. Linux下安装jboss并设置自启动服务

    一.JDK和JBOSS下载jdk:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.htm ...

  7. 洛谷P1052 过河

    P1052 过河 题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上. 由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青 ...

  8. UE4物理模块(一)---概述与可视化调试

    UE4.21前的版本采用的是NVIDIA的PhysX做为其默认的物理引擎,用于计算3D世界的碰撞查询与物理模拟.自4.21版本开始改物理调用接口,但这并不是闲来重构代码,果然在2019GDC大会上放出 ...

  9. Entrust - Laravel 用户权限系统解决方案 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 - Powered by PHPHub

    说明# Zizaco/Entrust 是 Laravel 下 用户权限系统 的解决方案, 配合 用户身份认证 扩展包 Zizaco/confide 使用, 可以快速搭建出一套具备高扩展性的用户系统. ...

  10. h5滚动页面固定导航

    1.需要效果 2.实现方法 (1)原生js实现 document.addEventListener('scroll', function (event) { var scrollDamo = wind ...