【bzoj1738】[Usaco2005 mar]Ombrophobic Bovines 发抖的牛 Floyd+二分+网络流最大流

题目描述

FJ's cows really hate getting wet so much that the mere thought of getting caught in the rain makes them shake in their hooves. They have decided to put a rain siren on the farm to let them know when rain is approaching. They intend to create a rain evacuation plan so that all the cows can get to shelter before the rain begins. Weather forecasting is not always correct, though. In order to minimize false alarms, they want to sound the siren as late as possible while still giving enough time for all the cows to get to some shelter. The farm has F (1 <= F <= 200) fields on which the cows graze. A set of P (1 <= P <= 1500) paths connects them. The paths are wide, so that any number of cows can traverse a path in either direction. Some of the farm's fields have rain shelters under which the cows can shield themselves. These shelters are of limited size, so a single shelter might not be able to hold all the cows. Fields are small compared to the paths and require no time for cows to traverse. Compute the minimum amount of time before rain starts that the siren must be sounded so that every cow can get to some shelter.

约翰的牛们非常害怕淋雨,那会使他们瑟瑟发抖.他们打算安装一个下雨报警器,并且安排了一个撤退计划.他们需要计算最少的让所有牛进入雨棚的时间.    牛们在农场的F(1≤F≤200)个田地上吃草.有P(1≤P≤1500)条双向路连接着这些田地.路很宽,无限量的牛可以通过.田地上有雨棚,雨棚有一定的容量,牛们可以瞬间从这块田地进入这块田地上的雨棚    请计算最少的时间,让每只牛都进入雨棚.

输入

* Line 1: Two space-separated integers: F and P

 * Lines 2..F+1: Two space-separated integers that describe a field. The first integer (range: 0..1000) is the number of cows in that field. The second integer (range: 0..1000) is the number of cows the shelter in that field can hold. Line i+1 describes field i. * Lines F+2..F+P+1: Three space-separated integers that describe a path. The first and second integers (both range 1..F) tell the fields connected by the path. The third integer (range: 1..1,000,000,000) is how long any cow takes to traverse it.

第1行:两个整数F和P;
第2到F+1行:第i+l行有两个整数描述第i个田地,第一个表示田地上的牛数,第二个表示田地上的雨棚容量.两个整数都在0和1000之间.
第F+2到F+P+I行:每行三个整数描述一条路,分别是起点终点,及通过这条路所需的时间(在1和10^9之间).

输出

* Line 1: The minimum amount of time required for all cows to get under a shelter, presuming they plan their routes optimally. If it not possible for the all the cows to get under a shelter, output "-1".

一个整数,表示最少的时间.如果无法使牛们全部进入雨棚,输出-1.

样例输入

3 4
7 2
0 4
2 6
1 2 40
3 2 70
2 3 90
1 3 120

样例输出

110


题解

floyd+二分+拆点+网络流

先用floyd求出任意两点之间的距离。

然后二分答案,若i与j之间的距离小于等于mid,则将i与j'(拆出来的点)间连一条容量为正无穷的边。

将源点与每个点间连一条容量为牛数的边,将每个拆出来的点与汇点间连一条容量为牛棚容量的边。

然后跑网络流,判断是否满流即可。

注意图可以是不连通的,所以当ans过大时,说明必须要用到题目中不存在的边,即无论如何都不能满足题意,输出-1。

注意距离要开long long。

#include <cstdio>
#include <cstring>
#include <queue>
#define inf 0x3fffffff
using namespace std;
queue<int> q;
long long dis[201][201];
int a[201] , b[201] , head[403] , to[180000] , val[180000] , next[180000] , cnt , s , t , deep[403];
void add(int x , int y , long long z)
{to[++cnt] = y;val[cnt] = z;next[cnt] = head[x];head[x] = cnt;
}
bool bfs()
{int x , i;while(!q.empty())q.pop();memset(deep , 0 , sizeof(deep));deep[s] = 1;q.push(s);while(!q.empty()){x = q.front();q.pop();for(i = head[x] ; i ; i = next[i]){if(val[i] && !deep[to[i]]){deep[to[i]] = deep[x] + 1;if(to[i] == t)return 1;q.push(to[i]);}}}return 0;
}
int dinic(int x , int low)
{if(x == t)return low;int temp = low , i , k;for(i = head[x] ; i ; i = next[i]){if(val[i] && deep[to[i]] == deep[x] + 1){k = dinic(to[i] , min(temp , val[i]));if(!k) deep[to[i]] = 0;val[i] -= k;val[i ^ 1] += k;if(!(temp -= k)) break;}}return low - temp;
}
bool judge(int n , long long mid , int sum)
{memset(head , 0 , sizeof(head));memset(to , 0 , sizeof(to));memset(val , 0 , sizeof(val));memset(next , 0 , sizeof(next));cnt = 1;int i , j , maxflow = 0;for(i = 1 ; i <= n ; i ++ ){add(s , i , a[i]);add(i , s , 0);add(i + n , t , b[i]);add(t , i + n , 0);for(j = 1 ; j <= n ; j ++ ){if(i == j || dis[i][j] <= mid)add(i , j + n , inf) , add(j + n , i , 0);}}while(bfs())maxflow += dinic(s , inf);return maxflow == sum;
}
int main()
{int n , m , i , j , k , x , y , suma = 0 , sumb = 0;long long z , l = 0 , r = 0 , mid , ans = -1;scanf("%d%d" , &n , &m);s = 0 , t = 2 * n + 1;for(i = 1 ; i <= n ; i ++ )scanf("%d%d" , &a[i] , &b[i]) , suma += a[i] , sumb += b[i];memset(dis , 0x3f , sizeof(dis));for(i = 1 ; i <= m ; i ++ )scanf("%d%d%lld" , &x , &y , &z) , dis[x][y] = dis[y][x] = min(dis[x][y] , z);if(suma > sumb){printf("-1\n");return 0;}for(k = 1 ; k <= n ; k ++ )for(i = 1 ; i <= n ; i ++ )for(j = 1 ; j <= n ; j ++ )dis[i][j] = min(dis[i][j] , dis[i][k] + dis[k][j]);for(i = 1 ; i <= n ; i ++ )for(j = 1 ; j <= n ; j ++ )if(i != j)r = max(r , dis[i][j]);while(l <= r){mid = (l + r) >> 1;if(judge(n , mid , suma))ans = mid , r = mid - 1;elsel = mid + 1;}printf("%lld\n" , ans < 10000000000000ll ? ans : -1);return 0;
}

转载于:https://www.cnblogs.com/GXZlegend/p/6394340.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/469434.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

动态规划思路和Python解决零钱兑换问题和最大乘积子序列的乘积的问题

动态规划&#xff08;Dynamic Programming&#xff09;思路和Python解题示例 动态规划是一种主要用来优化朴素递归的方法&#xff0c;每当输入不同值调用递归函数出现大量重复的&#xff08;子&#xff09;输入和调用&#xff08;返回结果&#xff09;时&#xff0c;就可以考虑…

open(/dev/ietctl, O_RDWR) 参数含义

这是文件I/O的常用函数&#xff0c;open函数&#xff0c;open函数用来打开一个设备&#xff0c;他返回的是一个整型变量&#xff0c;如果这个值等于-1&#xff0c;说明打开文件出现错误&#xff0c;如果为大于0的值&#xff0c;那么这个值代表的就是文件描述符。一般的写法是if…

【Pytorch神经网络实战案例】06 逻辑回归拟合二维数据

1 逻辑回归与拟合过程 1.1 准备数据-code_01_moons.py&#xff08;第1部分&#xff09; import sklearn.datasets import torch import numpy as np import matplotlib.pyplot as plt from LogicNet_fun import LogicNet,plot_losses,predict,plot_decision_boundary# 1.1 准…

将Win10包含中文的用户名改为英文的,同时解决Anaconda navigator无法运行jupyter的问题

Win10用户名包含中文字符导致无法在Anaconda navigator直接运行jupyter的问题 本篇文章内容包含&#xff1a; WIN10如何修改"C:\Users\用户名"中的用户名执行1后&#xff0c;也就是用户名修改为英文名后&#xff0c;在Anaconda navigator启动之前无法启动的jupyter…

linux dd使用记录

dd if/dev/sda of/dev/sdb bs10M Linux下显示dd命令的进度&#xff1a;dd if/dev/zero of/tmp/zero.img bs10M count100000想要查看上面的dd命令的执行进度&#xff0c;可以使用下面几种方法&#xff1a; 比如&#xff1a;每5秒输出dd的进度 方法一&#xff1a;watch -n 5 pkil…

【Pytorch神经网络理论篇】 01 Pytorch快速上手(一)概述+张量

同学你好&#xff01;本文章于2021年末编写&#xff0c;获得广泛的好评&#xff01; 故在2022年末对本系列进行填充与更新&#xff0c;欢迎大家订阅最新的专栏&#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现&#xff0c; Pytorch深度学习理论篇(2023版)目录地址…

Python写一个字符串的数字后缀部分递增的函数

需求&#xff1a; Python处理重名字符串&#xff0c;添加或递增数字字符串后缀 对于2个重名的字符串&#xff0c;添加数字后缀&#xff0c;比如两个重复的字符串s1 “name”, s2 “name”&#xff0c;将s2的名称设置为name_1对应3个或多个重名的字符串&#xff0c;数字部分实…

【Pytorch神经网络理论篇】 02 Pytorch快速上手(二)GPU与CPU张量切换+具有随机值的张量+张量的数学运算

同学你好&#xff01;本文章于2021年末编写&#xff0c;获得广泛的好评&#xff01; 故在2022年末对本系列进行填充与更新&#xff0c;欢迎大家订阅最新的专栏&#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现&#xff0c; Pytorch深度学习理论篇(2023版)目录地址…

解读Android 4.0 Camera原生应用程序的设计思路

解读Android 4.0 Camera原生应用程序的设计思路 一篇很不错的文章&#xff1a; http://my.oschina.net/jerikc/blog/907911. 设置摄像头方向 2. 打开线程与预览线程 3. 设置参数 4. Camera外设按键 5. 自动对焦与触摸对焦 6. 拍照 7. 人脸检测 8. 位置管理 9. 旋转管理 10. 变…

【Pytorch神经网络理论篇】 03 Pytorch快速上手(三)张量的数据操作

1 张量的数据操作 1.1 torch.reshape()实现数据维度变化 import torch a torch.tensor([[1,2],[3,4]]) print(torch.reshape(a,(1,-1))) # 将其转化为只有1行数据的张量,参数-1表示自动计算 # tensor([[1, 2, 3, 4]]) print(a.reshape((1,-1))) # # 将其转化为只有1行数据的…

写一个包含多个事件四则运算的留存SQL ——impala hive

在实现一个留存业务需求时&#xff0c;碰到了一个难题&#xff0c;我需要提供展示一个按照如下图格式的数据&#xff0c; day 1 ~ day n的第一行是留存用户数量&#xff0c;第二行是一个由多个事件组合执行四则算术运算得到的复合数值&#xff0c;这里碰到的难点主要是第二行的…

做个流量站-聚茶吧, 汇聚茶的地方

犹豫了好久&#xff0c;终于下定决心&#xff0c;做一回个人站长了&#xff0c;虽然没啥经验&#xff0c;但毕竟也是IT科班出身了&#xff0c;准备用一年的事件摸索一下内容站和SEO&#xff0c;看看能否积累点经验&#xff0c;赚点小钱。 推酷-靠爬虫起家的内容站 做内容站&…

V4L2用户空间和kernel层driver的交互过程

这篇文章详细分析了V4L2用户空间和kernel层driver的交互过程&#xff0c;目的只有一个&#xff1a;更清晰的理解V4L2视频驱动程序的系统结构&#xff0c;驱动编程方法&#xff0c;为以后开发视频驱动打好基础既然从用户层出发探究驱动层&#xff0c;这里先贴出应用层code&#…

【Pytorch神经网络理论篇】 04 Variable类型与自动微分模块剖析

同学你好&#xff01;本文章于2021年末编写&#xff0c;获得广泛的好评&#xff01; 故在2022年末对本系列进行填充与更新&#xff0c;欢迎大家订阅最新的专栏&#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现&#xff0c; Pytorch深度学习理论篇(2023版)目录地址…

Python 代理类实现和控制访问与修改属性的权限

本篇文章主要内容 代理类主要功能是将一个类实例的属性访问和控制代理到代码内部另外一个实例类&#xff0c;将想对外公布的属性的访问和控制权交给代理类来操作&#xff0c;保留不想对外公布的属性的访问或控制权&#xff0c;比如只读访问&#xff0c;日志功能 在代理类中实…

php 对象赋值后改变成员变量影响赋值对象

话不多说看代码 <?php class obj {}$obj1new obj();//实例化对象 $obj2$obj1;//赋值新对象 $obj1->name"test";//改变老对象的成员变量属性 var_dump($obj1); var_dump($obj2); $obj2->name"name";//改变新对象的成员变量属性 var_dump($obj1); …

Android Camera 通过V4L2与kernel driver的完整交互过程

原文地址&#xff1a;Android Camera 通过V4L2与kernel driver的完整交互过程 作者&#xff1a;xinyuwuxian Android Camera 通过V4L2与kernel driver的完整交互过程之前在 Android Camera 的执行流程http://blog.chinaunix.net/uid-26765074-id-3499537.html这篇文章中已经详细…

【Pytorch神经网络理论篇】 05 Module类的使用方法+参数Parameters类+定义训练模型的步骤与方法

同学你好&#xff01;本文章于2021年末编写&#xff0c;获得广泛的好评&#xff01; 故在2022年末对本系列进行填充与更新&#xff0c;欢迎大家订阅最新的专栏&#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现&#xff0c; Pytorch深度学习理论篇(2023版)目录地址…

Python实现访问者模式

假设要实现一个存放多种类型数据结构的对象&#xff0c;比如一个存放算术操作数和操作符的树结点&#xff0c;需要存放包含一元操作符、二元操作符和数字类型的结点 class Node:passclass UnaryOperator(Node):def __init__(self, operand):self.operand operandclass Binary…

BZOJ 2822: [AHOI2012]树屋阶梯 [Catalan数 高精度]

2822: [AHOI2012]树屋阶梯 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 779 Solved: 453[Submit][Status][Discuss]Description 暑假期间&#xff0c;小龙报名了一个模拟野外生存作战训练班来锻炼体魄&#xff0c;训练的第一个晚上&#xff0c;教官就给他们出了个难题。由…