poj2391
链接:http://poj.org/problem?id=2391
题解:
二分答案,变成判定性问题,只需把能经过的边在当前图中联通
另外对牛和牛棚要拆点
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
#define ll long long
const int maxn=1e6;
const int maxn2=;
#define INF 1e16
#define INF2 1e9
int n,m,s,t,l,sum,ax;
int head[maxn2],head2[maxn2],d[maxn2],cow[maxn2],cap[maxn2];
ll dis[maxn2][maxn2];
bool vis[maxn2];
struct re{
int a,b,c,flow;
}a[maxn];
void arr(int x,int y,int z)
{
a[++l].a=head[x];
ax=max(ax,l);
a[l].b=y;
a[l].c=z;
a[l].flow=;
head[x]=l;
}
queue<int> q;
bool bfs(){
memset(vis,,sizeof(vis));
q.push(s);
d[s]=; vis[s]=;
while (!q.empty())
{
int x=q.front();q.pop();
int u=head[x];
while (u)
{
int v=a[u].b;
if (!vis[v]&&a[u].c>a[u].flow)
{
vis[v]=;
d[v]=d[x]+;
q.push(v);
}
u=a[u].a;
}
}
return(vis[t]);
}
int dfs(int x,int y)
{
if (x==t||y==) return y;
int flow=,f,tmp;
int u=head[x];
while (u)
{
int v=a[u].b;
if (d[x]+==d[v]&&(f=dfs(v,min(y,a[u].c-a[u].flow)))>)
{
a[u].flow+=f;
if (u%) tmp=u+; else tmp=u-;
a[tmp].flow-=f;
flow+=f;
y-=f;
if (y==) break;
}
u=a[u].a;
}
head[x]=u;
return(flow);
}
int maxflow()
{
int flow=;
while (bfs())
{
flow+=dfs(s,INF2);
memcpy(head,head2,sizeof(head2));
}
return(flow);
}
void floyd()
{
for (int k=;k<=n;k++)
for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
if (i!=j)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
void buildedge(ll x)
{
memset(head,,sizeof(head));l=;
for (int i=;i<=n;i++)
{
arr(,i,cow[i]); arr(i,,);
arr(i+n,n*+,cap[i]); arr(n*+,i+n,);
arr(i,i+n,INF2); arr(i+n,i,);
}
for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
if (dis[i][j]<=x)
{
arr(i,j+n,INF2); arr(j+n,i,);
}
}
ll solve()
{
ll ans=-,h=,t=INF-;
while (h<=t)
{
ll mid=(h+t)/;
buildedge(mid); memcpy(head2,head,sizeof(head));
if (maxflow()>=sum)
{
ans=mid; t=mid-;
} else h=mid+;
}
return ans;
}
int main()
{
freopen("noip.in","r",stdin);
freopen("noip.out","w",stdout);
std::ios::sync_with_stdio(false);
while (cin>>n>>m)
{
sum=; s=; t=*n+;
for (int i=;i<=n;i++)
{
cin>>cow[i]>>cap[i];
sum+=cow[i];
}
for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
dis[i][j]=INF;
ll a,b,c;
for (int i=;i<=m;i++)
{
cin>>a>>b>>c;
dis[a][b]=min(dis[a][b],c);
dis[b][a]=min(dis[b][a],c);
}
floyd();
cout<<solve()<<endl;
}
return ;
}
poj2391的更多相关文章
- poj2391,poj2455
这两题本质是一致的: 一般来说,对于最长(短)化最短(长)的问题我们一般都使用二分答案+判定是否可行 因为这样的问题,我们一旦知道答案,就能知道全局信息 拿poj2455举例,对于二分出的一个答案,我 ...
- poj2391 Ombrophobic Bovines 拆点+二分法+最大流
/** 题目:poj2391 Ombrophobic Bovines 链接:http://poj.org/problem?id=2391 题意:有n块区域,第i块区域有ai头奶牛,以及一个可以容纳bi ...
- POJ2391 Ombrophobic Bovines 网络流拆点+二分+floyed
题目链接: id=2391">poj2391 题意: 有n块草地,每块草地上有一定数量的奶牛和一个雨棚,并给出了每一个雨棚的容(牛)量. 有m条路径连接这些草地 ,这些路径是双向的, ...
- ACM/ICPC 之 网络流-拆点构图(POJ2391)
需要直接到达,因此源点经过三条边后必须要达到汇点,但为了保证网络流的正确性(路径可反悔),因此不可限制层次网络的最高层次为3,最好的方法既是让所有点拆分成两个点,一个点从汇点进入,一个点通向汇点,任意 ...
- poj2391 Ombrophobic Bovines 题解
http://poj.org/problem?id=2391 floyd+网络流+二分 题意:有一个有向图,里面每个点有ai头牛,快下雨了牛要躲进雨棚里,每个点有bi个雨棚,每个雨棚只能躲1头牛.牛可 ...
- POJ2391 Ombrophobic Bovines(网络流)(拆点)
Ombrophobic Bovines Time Limit: 1000MS Memory Limit: 65536K Total Submissions ...
- POJ2391 Ombrophobic Bovines
Ombrophobic Bovines Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 19359 Accepted: 4 ...
- POJ2391:Ombrophobic Bovines(最大流+Floyd+二分)
Ombrophobic Bovines Time Limit: 1000MSMemory Limit: 65536K Total Submissions: 21660Accepted: 4658 题目 ...
- poj2391 最大流+拆点
题意:F块草坪,上面有n头牛,可以容纳m个牛遮雨.将草坪一份为2,成为二部图. 对于此题,和poj2112很像,只是2112很明显的二部图.这道题就开始敲,但是建图遇到问题,草坪的2个值怎么处理,于是 ...
随机推荐
- Python复习笔记(四)高阶函数/返回函数/匿名函数/偏函数/装饰器
一.map/reduce map map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次 作用到序列的每个元素,并把结果作为新的Iterator返回. reduce r ...
- PHPEXCEL xls模板导入,及格式自定义:合并单元格、加粗、居中等操作
PHPExcel 是用来操作Office Excel 文档的一个PHP类库,它基于微软的OpenXML标准和PHP语言.可以使用它来读取.写入不同格式的电子表格,如 Excel (BIFF) .xls ...
- 第二节--Servlet
1.在tomcat的webapp下新建一个web项目test 要有WEB-INF目录,其下有web.xml. 2.WEB-INF下文件是给tomcat使用的 3.用户访问localhost:848 ...
- 一个极好的JavaScript学习网址
JavaScript学习网址:https://javascript.info/ 网址界面如下,内容和排版都非常不错,内容也比较新,不像一些教程已经是好几年前的了.把这个教程浏览一遍,能够解答很多看代码 ...
- C# 解决请求被中止:无法建立SSL / TLS安全通道问题
在网上查了很多资料,基本是这么一个思路: 在通过 HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url); req.Method ...
- 搭建yum服务器
一.yum服务器端配置1.安装FTP软件#yum install vsftpd #service vsftpd start#chkconfig --add vsftpd#chkconfig vsftp ...
- eMMC基础技术6:eMMC data读写
1. 前言 data可以经data线从host发往device,也可以从device发往host 数据线以是1线(DATA0),4线(DATA0~DATA3),8线(DATA0~DATA7) 对每条数 ...
- python通过操作windows系统注册表方式修改环境变量
#coding=utf8 import os import sys from subprocess import check_call if sys.hexversion > 0x0300000 ...
- git免密配置
1.在git安装目录下双击bash.exeC:\DevTools\Git\bin 2.在弹出窗口内输入,回车,回车ssh-keygen -t rsa -C "542113457@qq.com ...
- centos系统初始化流程及实现系统裁剪
Linux系统的初始化流程: POST:ROM+RAM BIOS: Boot Sequence MBR: 446:bootloader 64: 分区表 2: 5A kernel文件:基本磁盘分区 /s ...