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 ...
随机推荐
- 责任链模式(Chain of Responsibility、Handler)(请求处理建立链)
(使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止.) 从名字中看出 ,系统中将会存在多个有类似处理能力的对 ...
- Uva10795 A Different Task
A Different Task https://vjudge.net/problem/UVA-10795 题目大意:给定一个汉诺塔初末状态,求从初状态到末状态最少需要多少步. 考虑最大的一个初末不同 ...
- 国内在Amazon fireTV或者fire平板下载应用(netflix\hulu\YouTube)的方法
1.首先需要vpn翻墙至U.S. 2.需要一个美国亚马逊账户,并设置收货地址 (Manage Your Fire & Kindle 1-Click Payment Settings ),如果只 ...
- TZ_02MyBatis_一级缓存和二级缓存
1.Mybatis中的缓存 1>什么是缓存 存在于内存中的临时数据. 2> 为什么使用缓存 减少和数据库的交互次数,提高执行效率. 3>什么样的数 ...
- 【笔记】LR11中关联设置
LR中关联建议都手动进行,自动不好用,也容易出错. 在LR中我们什么要做关联:1.关联解决的是动态数据的参数化.2.关联的数据一定是服务器响应的数据.3.服务器响应过来的数据在后面的服务还要使用. 手 ...
- Laravel-admin之Driver [] is not supported
使用Laravel-admin做项目,原本好好的项目,今天一运行则报错:Driver [] is not supported,截图如下: 翻看百度翻译之后,才知道是不支持驱动器[],但是知道意思还是不 ...
- JAVA获取磁盘空间
需要把磁盘空间显示在页面上,这样就不用去服务器查看了,方便 两个办法 File file = new File("D:"); long totalSpace = file.getT ...
- Leetcode34.Find First and Last Position of Element in Sorted Array在排序数组中查找元素的位置
给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值,返回 [ ...
- 【笔记】http1.1支持的7种请求方法
本文是本人复习http协议整理笔记,以备后续查阅. http1.1支持的7种请求方法:get.post.head.options.put.delete.trace 在internet应用中,最常用的请 ...
- Hdu 4751(2-SAT)
题目链接 Divide Groups Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...