poj2391 最大流+拆点
题意: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 最大流+拆点的更多相关文章
- poj2391 最大流+拆点+二分答案+Floyd
Ombrophobic Bovines Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 19553 Accepted: 4 ...
- poj 2391 Ombrophobic Bovines, 最大流, 拆点, 二分, dinic, isap
poj 2391 Ombrophobic Bovines, 最大流, 拆点, 二分 dinic /* * Author: yew1eb * Created Time: 2014年10月31日 星期五 ...
- poj 3498 March of the Penguins(最大流+拆点)
题目大意:在南极生活着一些企鹅,这些企鹅站在一些冰块上,现在要让这些企鹅都跳到同一个冰块上.但是企鹅有最大的跳跃距离,每只企鹅从冰块上跳走时会给冰块造成损害,因此企鹅跳离每个冰块都有次数限制.找出企鹅 ...
- poj2391 Ombrophobic Bovines 拆点+二分法+最大流
/** 题目:poj2391 Ombrophobic Bovines 链接:http://poj.org/problem?id=2391 题意:有n块区域,第i块区域有ai头奶牛,以及一个可以容纳bi ...
- hdu4289 最小割最大流 (拆点最大流)
最小割最大流定理:(参考刘汝佳p369)增广路算法结束时,令已标号结点(a[u]>0的结点)集合为S,其他结点集合为T=V-S,则(S,T)是图的s-t最小割. Problem Descript ...
- BZOJ-1877 晨跑 最小费用最大流+拆点
其实我是不想做这种水题的QWQ,没办法,剧情需要 1877: [SDOI2009]晨跑 Time Limit: 4 Sec Memory Limit: 64 MB Submit: 1704 Solve ...
- BZOJ-1070 修车 最小费用最大流+拆点+略坑建图
1070: [SCOI2007]修车 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 3624 Solved: 1452 [Submit][Status] ...
- hdu 4289 最大流拆点
大致题意: 给出一个又n个点,m条边组成的无向图.给出两个点s,t.对于图中的每个点,去掉这个点都需要一定的花费.求至少多少花费才能使得s和t之间不连通. 大致思路: 最基础的拆点最大 ...
- 洛谷 P2764 最小路径覆盖问题【最大流+拆点+路径输出】
题目链接:https://www.luogu.org/problemnew/show/P2764 题目描述 «问题描述: 给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V ...
随机推荐
- Struts2启动问题:ClassNotFoundException: org...dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
错误信息: java.lang.ClassNotFoundException: org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExec ...
- 在Linux中常用的启动引导工具:grub和lilo
在Linux和WINDOWS两系统并存时就需要安装GRUB(Grand Unified Bootloader),GRUB被广泛地用于替代lilo,GRUB支持在启动时使用命令行模式,支持md5加密保护 ...
- mybatis学习:mybatis注解开发一对一的查询配置
实体类: public class Account { private Integer id; private Integer uid; private Double money; private U ...
- HDU3374 字符串最大最小表示法模板
一开始没太看懂什么意思,拿笔反复推了一遍才大概知道最大最小表示法是怎么求的,感觉太神奇了... #include <iostream> #include <cstdio> #i ...
- layui -page 分页类
<?phpnamespace page; // +---------------------------------------------------------------------- / ...
- TZ_09_MyBatis的pageHelper
1.分页操作使用MyBatis的PageHelper 1>导入pageHelper的坐标 <dependency> <groupId>com.github.pagehel ...
- Objective-C头文件导出工具class-dump
首先,这个工具是开源的.作者网站:http://stevenygard.com/projects/class-dump/ 用途: 分析库文件或可执行文件,得到Objective-C类和部分C结构体的信 ...
- poj 3468 A Simple Problem with Integers (线段树区间更新求和lazy思想)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 75541 ...
- linux 下环境变量设置
Ubuntu Linux系统包含两类环境变量:系统环境变量和用户环境变量.系统环境变量对所有系统用户都有效,用户环境变量仅仅对当前的用户有效. 修改用户环境变量 用户环境变量通常被存储在下面的文件中: ...
- Python子进程 (subprocess包)
Python子进程 (subprocess包) subprocess以及常用的封装函数 当我们运行python的时候,我们都是在创建并运行一个进程.正如我们在Linux进程基础中介绍的那样,一个进程可 ...