洛谷P2402 奶牛隐藏

题目背景

这本是一个非常简单的问题,然而奶牛们由于下雨已经非常混乱,无法完成这一计算,于是这个任务就交给了你。(奶牛混乱的原因看题目描述)

题目描述

在一个农场里有n块田地。某天下午,有一群牛在田地里吃草,他们分散在农场的诸多田地上,农场由m条无向的路连接,每条路有不同的长度。

突然,天降大雨,奶牛们非常混乱,想要快点去躲雨。

已知每个田地都建立有一个牛棚,但是每个牛棚只能容纳一定数量的牛躲雨,如果超过这个数量,那多出的牛只能去别的田地躲雨。

奶牛们每移动1的距离花费1时间,奶牛们想知道它们全部都躲进牛棚,最少需要多少时间。(即最后一头奶牛最少要花多久才能躲进牛棚)。

输入输出格式

输入格式:

第一行输入两个整数N,M。N表示田地块数,M表示路径数。

接下来N行,每行两个整数S,P,分别表示该田地现在有几头牛以及该田地的牛棚最多可以容纳多少牛。

接下来M行,每行3个整数A,B,C,表示存在一条路径连接A,B,并且它的长度为C。

输出格式:

一个整数表示所有奶牛全都躲进牛棚所用的最少时间。如果无法使全部奶牛都躲进牛棚,输出-1。

输入输出样例

输入样例:

3 4
7 2
0 4
2 6
1 2 40
3 2 70
2 3 90
1 3 120
输出样例:

110

说明

【样例解释】

1号点的两只牛直接躲进1号牛棚,剩下的5只中,4只跑去2号点,还有一只从1->2->3,3号点的2只牛也直接躲进去,这样最慢的牛花费的时间是110。

数据范围 : 对于100%的数据,N<=200 M<=1500


题解Here!

一开始看到题目,然后智障一样地以为这是个费用流。。。

但是交上去只有无解的那组过了。。。10分。。。

$hack$可以这么干:

有$3$块田,$1,2$处各有一头牛,$2,3$处各有一个容量为$1$的棚,$1->2$,$2->3$的长度均为$1$。

如果跑费用流会怎么样?

结果是$2$,即:将$1$中的奶牛移到$3$,$2$中奶牛不动。

但是显然我们可以将$1$中的奶牛移到$2$,$2$中的奶牛移到$3$,总时间就是$1$。

于是这个方法就被$hack$了。。。

那怎么办呢?

首先我们发现,许多路径是可以不用走的,直接走最短路就好。

注意到$n\leq 200$,于是直接$Floyd$大法。

但是之后呢?

我们发现题目的意思就是:耗时最长的奶牛所用时间最少!

这。。。二分答案啊!

二分一下耗时最长的奶牛所用时间。

然后把所有道路长度大于这个值的路全部砍掉。

注意到我们的目的是让所有奶牛都进入牛棚。

所以我们只要在新的图上跑最大流,得出的答案就是当前图中最多有多少奶牛可以进入牛棚。

这个玩意是有单调性的,所以二分是可行的。

但是每块地有奶牛,有牛棚,怎么办?

没事我们拆个点就好。

将每个点$x$拆成$x,x'$。

设$num[x]$为$x$的奶牛总数,$size[x]$是$x$的牛棚大小。

$<u,v,w>$为从$u$到$v$,流量为$w$的弧。(包括反向弧)

设立源汇点$S,T$,连边:$<S,x,num[x]>,<x',T,size[x]>$

然后枚举每一对点$x,y$,若道路长度小于我们二分的值,连边:$<x,y',MAX>,<y,x',MAX>$

然后跑$Dinic$即可。

如果$\text{最大流}==\text{奶牛数}$,就把上限调小;

如果$\text{最大流}!=\text{奶牛数}$,就把下限调大。

如果在二分过程中一直都没有$\text{最大流}==\text{奶牛数}$,说明根本无解,直接打$-1$就好。

然后我这个大$ZZ$又没判$-1$。。。

结果只有无解的那组没过。。。

和一开始正好相反。。。尴尬。。。

记得开$long\ long$!记得开$long\ long$!!记得开$long\ long$!!!

附带码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<cstring>
#define MAXN 210
#define MAXM 200010
#define MAX (1LL<<60)
using namespace std;
int n,m,sum=0;
int num[MAXN],size[MAXN];
inline int read(){
int date=0;char c=0;
while(c<'0'||c>'9')c=getchar();
while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();}
return date;
}
namespace Floyd{
long long map[MAXN][MAXN];
void floyd(){
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
map[i][j]=min(map[i][j],map[i][k]+map[k][j]);
}
void work(){
int u,v,w;
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)map[i][j]=(i==j?0:MAX);
for(int i=1;i<=m;i++){
u=read();v=read();w=read();
if(map[u][v]>w)map[u][v]=map[v][u]=w;
}
floyd();
}
}
namespace Dinic{
queue<int> q;
int s,t,c=2,head[MAXN<<1],deep[MAXN<<1];
struct Edge{
int next,to;
long long w;
}a[MAXM];
inline void add(int u,int v,long long w){
a[c].to=v;a[c].w=w;a[c].next=head[u];head[u]=c++;
a[c].to=u;a[c].w=0;a[c].next=head[v];head[v]=c++;
}
bool bfs(){
while(!q.empty())q.pop();
int u,v;
for(int i=1;i<=t;i++)deep[i]=0;
deep[s]=1;
q.push(s);
while(!q.empty()){
u=q.front();
q.pop();
for(int i=head[u];i;i=a[i].next){
v=a[i].to;
if(a[i].w&&!deep[v]){
deep[v]=deep[u]+1;
if(v==t)return true;
q.push(v);
}
}
}
return false;
}
long long dfs(int x,long long limit){
if(x==t)return limit;
int v;
long long sum,cost=0;
for(int i=head[x];i;i=a[i].next){
v=a[i].to;
if(a[i].w&&deep[v]==deep[x]+1){
sum=dfs(v,min(a[i].w,limit-cost));
if(sum>0){
a[i].w-=sum;
a[i^1].w+=sum;
cost+=sum;
if(cost==limit)break;
}
else deep[v]=-1;
}
}
return cost;
}
long long dinic(){
long long ans=0;
while(bfs())ans+=dfs(s,MAX);
return ans;
}
void rebuild(long long x){
c=2;
memset(head,0,sizeof(head));
for(int i=1;i<=n;i++){
add(s,i,num[i]);
add(i+n,t,size[i]);
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(Floyd::map[i][j]<=x)add(i,j+n,MAX);
}
void work(){
bool flag=false;
long long l=MAX,r=-MAX,mid,ans=MAX;
s=n*2+1;t=n*2+2;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
if(Floyd::map[i][j]==MAX)continue;
l=min(l,Floyd::map[i][j]);
r=max(r,Floyd::map[i][j]);
}
while(l<=r){
mid=l+r>>1;
rebuild(mid);
long long s=dinic();
if(s==sum){
ans=min(ans,mid);
flag=true;
r=mid-1;
}
else l=mid+1;
}
if(flag)printf("%lld\n",ans);
else printf("-1\n");
}
}
void init(){
n=read();m=read();
for(int i=1;i<=n;i++){
num[i]=read();size[i]=read();
sum+=num[i];
}
}
int main(){
init();
Floyd::work();
Dinic::work();
return 0;
}

洛谷P2402 奶牛隐藏的更多相关文章

  1. 洛谷P2402 奶牛隐藏(网络流,二分答案,Floyd)

    洛谷题目传送门 了解网络流和dinic算法请点这里(感谢SYCstudio) 题目 题目背景 这本是一个非常简单的问题,然而奶牛们由于下雨已经非常混乱,无法完成这一计算,于是这个任务就交给了你.(奶牛 ...

  2. 洛谷2344 奶牛抗议(DP+BIT+离散化)

    洛谷2344 奶牛抗议 本题地址:http://www.luogu.org/problem/show?pid=2344 题目背景 Generic Cow Protests, 2011 Feb 题目描述 ...

  3. [洛谷P1842] 奶牛玩杂技

    题目类型:贪心+证明,经典题 传送门:>Here< 题意:有\(N\)头奶牛,每个奶牛有一个重量\(W[i]\),力量\(S[i]\).定义每个奶牛的压扁程度为排在它前面的所有奶牛的总量之 ...

  4. [洛谷P2124] 奶牛美容

    洛谷题目链接:奶牛美容 题目描述 输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例#1: 6 16 ................ ..XXXX....XXX... ...XXXX... ...

  5. [WC2002][洛谷P1578]奶牛浴场

    洛谷题解里那个人可真是话多呢. 题目描述 由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少.为了讨好奶牛,John决定在牛场中建造一个大型浴场.但是John的奶牛有一个奇怪的习惯,每 ...

  6. 洛谷 P1578 奶牛浴场

    https://www.luogu.org/problemnew/show/P1578 题解 另外这题有一些小坑,洛谷的题解里面有讲 #pragma GCC optimize("Ofast& ...

  7. [洛谷p2858] 奶牛零食

    题目链接: 点我 题目分析: 这是什么,区间dp吗?怎么大佬都在说区间dp的样子 完蛋区间dp都不知道是啥quq 于是使用了玄学的姿势A过了这道题 设dp[i][j][0]表示第i天,左边选了j个,当 ...

  8. 洛谷 P1843 奶牛晒衣服

    题目背景 熊大妈决定给每个牛宝宝都穿上可爱的婴儿装 . 于是 , 为牛宝宝洗晒衣服就成了很不爽的事情. 题目描述 熊大妈请你帮助完成这个重任 . 洗完衣服后 , 你就要弄干衣服 . 衣服在自然条件下用 ...

  9. 洛谷P1154 奶牛分厩

    P1154 奶牛分厩 173通过 481提交 题目提供者该用户不存在 标签高性能 难度普及- 时空限制1s / 128MB 提交  讨论  题解 最新讨论更多讨论 测试点3??? 求助!超时了 我抗议 ...

随机推荐

  1. EffectiveJava(18)接口优先于抽象类

    ***接口和抽象类同样可以用来定义多个实现的类型,然而,接口通常是最佳途径.*** 这条规则有个例外 – 当演变的容易性比灵活性和功能性更为重要的时候,应该用抽象来定义类型 ,但前提是必须理解并且可以 ...

  2. SpringMVC文件上传的配置

    记述一下步骤以备查. 准备工作: 需要把Jakarta Commons FileUpload及Jakarta Commons io的包放lib里. 我这边的包是: commons-fileupload ...

  3. agruments应用——求出函数参数的总合&&css函数——设置/读取对象的属性&&当前输入框高亮显

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. 倍福TwinCAT(贝福Beckhoff)基础教程2.2 TwinCAT常见类型使用和转换_函数块

    右击POUs,添加一个FB功能块,相比于FUN,FB功能块有INPUT,OUTPUT,还有VAR,即FB可以有多个输出,但是整个FB没有返回值   实现相同的功能,FB要比FUN难看的多,FB要声明实 ...

  5. Java 实例

    Java 实例 本章节我们将为大家介绍 Java 常用的实例,通过实例学习我们可以更快的掌握 Java 的应用. Java 环境设置实例 Java 实例 – 如何编译一个Java 文件? Java 实 ...

  6. css 中 important 的用法

      css 中 important 的如何使用?  important对 一个良好(或者是标准)的浏览器来说,不仅仅是从顺序上提升代码的优先级,还可以用来提升class的优先级(比如firefox), ...

  7. vue created 生命周期

    在实例创建完成后被立即调用.在这一步,实例已完成以下的配置:数据观测 (data observer),属性和方法的运算,watch/event 事件回调.然而,挂载阶段还没开始,$el属性目前不可见. ...

  8. Android监听HOME键的最简单的方法

    public static final int FLAG_HOMEKEY_DISPATCHED = 0x80000000; public void onCreate(Bundle savedInsta ...

  9. hadoop:WordCount问题总结

    今天玩了一下hadoop的MapReduce,中途遇到了几个问题,在此记录一下. 1.一切按照配置完成之后,hadoop namenode format,start-all.sh启动,使用jps查看进 ...

  10. 多trac的安装和配置

    其他相关网页: trac+svn: http://wenku.baidu.com/view/84389a81ec3a87c24028c43f.html apache(GCI):http://hi.ba ...