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使用BP神经网络示例
1.简介(只是简单介绍下理论内容帮助理解下面的代码,如果自己写代码实现此理论不够) 1) BP神经网络是一种多层网络算法,其核心是反向传播误差,即: 使用梯度下降法(或其他算法),通过反向传播来不断调 ...
- 【转】基于VSM的命名实体识别、歧义消解和指代消解
原文地址:http://blog.csdn.net/eastmount/article/details/48566671 版权声明:本文为博主原创文章,转载请注明CSDN博客源地址!共同学习,一起进步 ...
- Java基础其他
1. 二进制 进制就是进位制,常见的有二进制.十进制.十六进制等 在进制中,可用符号的数量称为基数,基数为n就称为n进制,逢n进一位: 二进制:0 1 十进制:0 1 2 3 4 5 6 7 8 9 ...
- Linux 4.10.8 根文件系统制作(三)---制作yaffs文件系统
这里直接用的是韦东山提供的工具. yaffs文件系统是专门用于nandflash的文件系统 我们前面已经下载了yaffs 的源码,也做了文件系统目录的构建. 在yaffs2的源码目录中有一个utils ...
- pyinstaller 打包不成功,提示inporterror 缺少xlrd、xlwt
问题:pyinstaller 打包不成功,提示inporterror 缺少xlrd.xlwt 解决:将 pypiwin 230 改为 219
- Redis 主从 keepalived高可用 实现 VIP 自动漂移
Redis 多主写多从度 配置启动OK :直接配 keepalived 相关配置: redis 默认路径 :/usr/local/redis keepalived 默认路径 :/etc/keepal ...
- luogu P2900 [USACO08MAR]土地征用Land Acquisition
写这道题时,预处理部分少打了等号,吓得我以为斜率优化错了或者被卡精了 mmp 首先有一个很明显的结论(逃),就是一个土地如果长(\(x\))与宽(\(y\))都比另一个土地小,那么这个土地一定可以跟那 ...
- Java9都快发布了,Java8的十大新特性你了解多少呢?
Java 9预计将于今年9月份发布,这是否会是一次里程碑式的版本,我们拭目以待.今天,我们先来复习一下2014年发布的Java 8的十大新特性. Java 8可谓是自Java 5以来最具革命性的版本了 ...
- Spring之JDBCTemplate学习
一.Spring对不同的持久化支持: Spring为各种支持的持久化技术,都提供了简单操作的模板和回调 ORM持久化技术 模板类 JDBC org.springframework.jdbc.core. ...
- .NET中制做对象的副本(三)通过序列化和反序列化为复杂对象制作副本
1.类的定义 /// <summary> /// 学生信息 /// </summary> [Serializable] public class Stu { /// <s ...