链接: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的更多相关文章

  1. poj2391,poj2455

    这两题本质是一致的: 一般来说,对于最长(短)化最短(长)的问题我们一般都使用二分答案+判定是否可行 因为这样的问题,我们一旦知道答案,就能知道全局信息 拿poj2455举例,对于二分出的一个答案,我 ...

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

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

  3. POJ2391 Ombrophobic Bovines 网络流拆点+二分+floyed

    题目链接: id=2391">poj2391 题意: 有n块草地,每块草地上有一定数量的奶牛和一个雨棚,并给出了每一个雨棚的容(牛)量. 有m条路径连接这些草地  ,这些路径是双向的, ...

  4. ACM/ICPC 之 网络流-拆点构图(POJ2391)

    需要直接到达,因此源点经过三条边后必须要达到汇点,但为了保证网络流的正确性(路径可反悔),因此不可限制层次网络的最高层次为3,最好的方法既是让所有点拆分成两个点,一个点从汇点进入,一个点通向汇点,任意 ...

  5. poj2391 Ombrophobic Bovines 题解

    http://poj.org/problem?id=2391 floyd+网络流+二分 题意:有一个有向图,里面每个点有ai头牛,快下雨了牛要躲进雨棚里,每个点有bi个雨棚,每个雨棚只能躲1头牛.牛可 ...

  6. POJ2391 Ombrophobic Bovines(网络流)(拆点)

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

  7. POJ2391 Ombrophobic Bovines

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

  8. POJ2391:Ombrophobic Bovines(最大流+Floyd+二分)

    Ombrophobic Bovines Time Limit: 1000MSMemory Limit: 65536K Total Submissions: 21660Accepted: 4658 题目 ...

  9. poj2391 最大流+拆点

    题意:F块草坪,上面有n头牛,可以容纳m个牛遮雨.将草坪一份为2,成为二部图. 对于此题,和poj2112很像,只是2112很明显的二部图.这道题就开始敲,但是建图遇到问题,草坪的2个值怎么处理,于是 ...

随机推荐

  1. python 面试题--你能做出多少?

    python3中__get__,getattr,__getattribute__的区别 什么是 GIL 详细博客 GIL = Global Intercept Lock 全局解释器锁,任意时刻在解释器 ...

  2. typealias

    类的别名

  3. Java入门系列(十)Java IO

    概述 总体而言,java的读写操作又分为两种:字符流和字节流. 实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件. 什么是流? ...

  4. C# Winform继承窗体打开设计器白屏的一例解决方法

    环境VS2017 15.5.4,Win10开发过程中,发现一些窗体打开设计器会卡死白屏,另外有一些不会,(两者运行时正常),最小化vs后甚至能把工具箱连带搞黑,严重影响开发效率,经过一天多的对比研究, ...

  5. DotNetBar 控件设置空内容时显示内容

    可以通过修改所有关于Watermark时的设置.

  6. C++中路径的处理方法(string)

    string 类提供字符串处理函数,利用这些函数,程序员可以在字符串内查找字符,提取连续字符序列(称为子串),以及在字符串中删除和添加.我们将介绍一些主要函数. 1.函数find_first_of() ...

  7. Linux cache 缓存过大

    linux cache 缓存过大 : 除重启服务 之外:直接释放内存方式之一: 修改配置释放cached内存: echo > /proc/sys/vm/drop_caches

  8. Nginx 虚拟主机示例

    Nginx server 模块 server { // 标识虚拟主机开始 listen ; ## // 指定虚拟主机服务器端口 server_name localhost; // 指定 IP地址或者域 ...

  9. 在浏览器中使用Javascript

    在浏览器中点击鼠标右键——检查,选择console,可以在里面写Javascript代码,并可以在页面实时看到结果: 关于JavaScript的几个注意事项: JavaScript 语句和 JavaS ...

  10. Springboot使用FastJson后,接口返回中文乱码的问题解决。

    哎,天下文章一大抄,到处都是一模一样的教你怎么替换掉jackson成fastjson的,可后续中文乱码网上居然没一篇文章.翻了一会源码还是写个文章共享下吧.免得后来人又浪费时间折腾. 在springb ...