bzoj 1738 [Usaco2005 mar]Ombrophobic Bovines 发抖的牛 最大流+二分
题目要求所有牛都去避雨的最长时间最小。
显然需要二分 二分之后考虑如何判定。
显然每头牛都可以去某个地方 但是前提是最短路径<=mid.
依靠二分出来的东西建图。可以发现这是一个匹配问题 dinic即可。
注意数组要开两倍 因为要拆点 我开小了wa了两发才意识过来。
const int MAXN=410;
int n,m,S,len,T,L,R,ans;
ll a[MAXN][MAXN];
int c[MAXN],cc[MAXN],cur[MAXN],vis[MAXN],q[MAXN];
int lin[MAXN],ver[MAXN*MAXN<<1],nex[MAXN*MAXN<<1],e[MAXN*MAXN<<1];
inline void add(int x,int y,int z)
{
ver[++len]=y;nex[len]=lin[x];lin[x]=len;e[len]=z;
ver[++len]=x;nex[len]=lin[y];lin[y]=len;e[len]=0;
}
inline int dinic(int x,int flow)
{
if(x==T)return flow;
int res=flow,k;
for(int i=cur[x];i&&res;i=nex[i])
{
int tn=ver[i];cur[x]=i;
if(vis[tn]==vis[x]+1&&e[i])
{
k=dinic(tn,min(e[i],res));
if(!k){vis[tn]=0;continue;}
e[i]-=k;e[i^1]+=k;res-=k;
}
}
return flow-res;
}
inline int bfs()
{
rep(1,T,i)vis[i]=0,cur[i]=lin[i];
L=R=0;q[++R]=S;vis[S]=1;
while(++L<=R)
{
int x=q[L];
go(x)
{
if(vis[tn]||!e[i])continue;
vis[tn]=vis[x]+1;
q[++R]=tn;
if(tn==T)return 1;
}
}
return 0;
}
inline int check(ll x)
{
len=1;
memset(lin,0,sizeof(lin));
rep(1,n,i)
{
rep(1,n,j)if(a[i][j]<=x)add(i,j+n,INF);
add(S,i,c[i]);add(i+n,T,cc[i]);
}
int flow,sum=0;
while(bfs())while((flow=dinic(S,INF)))sum+=flow;
//cout<<sum<<endl;
return sum>=ans;
}
int main()
{
freopen("1.in","r",stdin);
get(n);get(m);int cnt1=0;S=n<<1|1;T=S+1;
rep(1,n,i)get(c[i]),cc[i]=read(),ans+=c[i],cnt1+=cc[i];
if(ans>cnt1){puts("-1");return 0;}
rep(1,n,i)rep(1,i,j)if(i!=j)a[j][i]=a[i][j]=P;
rep(1,m,i)
{
int get(x);int get(y);int get(z);
a[x][y]=a[y][x]=min(a[x][y],(ll)z);
}
rep(1,n,k)rep(1,n,i)rep(1,i,j)a[j][i]=a[i][j]=min(a[i][j],a[i][k]+a[k][j]);
ll l=0,r=0;
rep(1,n,i)rep(1,i,j)if(a[i][j]!=P)r=max(r,a[i][j]);
if(!check(r)){puts("-1");return 0;}
while(l<r)
{
ll mid=(l+r)>>1;
if(check(mid))r=mid;
else l=mid+1;
}
putl(l);return 0;
}
bzoj 1738 [Usaco2005 mar]Ombrophobic Bovines 发抖的牛 最大流+二分的更多相关文章
- BZOJ 1738: [Usaco2005 mar]Ombrophobic Bovines 发抖的牛( floyd + 二分答案 + 最大流 )
一道水题WA了这么多次真是.... 统考终于完 ( 挂 ) 了...可以好好写题了... 先floyd跑出各个点的最短路 , 然后二分答案 m , 再建图. 每个 farm 拆成一个 cow 点和一个 ...
- BZOJ 1738: [Usaco2005 mar]Ombrophobic Bovines 发抖的牛
Description 约翰的牛们非常害怕淋雨,那会使他们瑟瑟发抖.他们打算安装一个下雨报警器,并且安排了一个撤退计划.他们需要计算最少的让所有牛进入雨棚的时间. 牛们在农场的F(1≤F≤200 ...
- BZOJ 1738: [Usaco2005 mar]Ombrophobic Bovines 发抖的牛 网络流 + 二分 + Floyd
Description FJ's cows really hate getting wet so much that the mere thought of getting caught in the ...
- BZOJ1738 [Usaco2005 mar]Ombrophobic Bovines 发抖的牛
先预处理出来每个点对之间的最短距离 然后二分答案,网络流判断是否可行就好了恩 /************************************************************ ...
- 【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 m ...
- BZOJ 1739: [Usaco2005 mar]Space Elevator 太空电梯
题目 1739: [Usaco2005 mar]Space Elevator 太空电梯 Time Limit: 5 Sec Memory Limit: 64 MB Description The c ...
- poj2391 Ombrophobic Bovines 拆点+二分法+最大流
/** 题目:poj2391 Ombrophobic Bovines 链接:http://poj.org/problem?id=2391 题意:有n块区域,第i块区域有ai头奶牛,以及一个可以容纳bi ...
- BZOJ 1734: [Usaco2005 feb]Aggressive cows 愤怒的牛( 二分答案 )
最小最大...又是经典的二分答案做法.. -------------------------------------------------------------------------- #inc ...
- bzoj 1734: [Usaco2005 feb]Aggressive cows 愤怒的牛
1734: [Usaco2005 feb]Aggressive cows 愤怒的牛 Description Farmer John has built a new long barn, with N ...
随机推荐
- C++中string转换为char*类型返回后乱码问题
问题来源: 在写二叉树序列化与反序列化时发现序列化函数为char* Serialize1(TreeNode *root) 其函数返回类型为char*,但是我在实现的过程中为了更方便的操作添加字符串使 ...
- POJ3262贪心
题意:FJ去砍树,然后和平时一样留了 N (2 ≤ N ≤ 100,000)头牛吃草.当他回来的时候,他发现奶牛们正在津津有味地吃着FJ种的美丽的花!为了减少后续伤害,FJ决定立即采取行动:运输每头牛 ...
- 关于npm和yarn 安装vue脚手架
第一篇博客有点小紧张.轻喷~ 第一步:安装node.js 地址 --------https://nodejs.org/en/ 详细步骤这里就不写了 可以去看 地址 ----- ...
- Django---进阶15
目录 文章详情页 文章点赞点踩 文章评论 文章详情页 # url设计 /username/article/1 # 先验证url是否会被其他url顶替 # 文章详情页和个人站点基本一致 所以用模版继承 ...
- CentOS7安装Oracle 11g
准备工作 1.下载Oracle安装包:linux.x64_11gR2_database_1of2.zip 和 linux.x64_11gR2_database_2of2.zip ,可以下载到本地,通过 ...
- javascript基础(一): 浏览器控制台使用Element,console,network,source,application
console https://www.jianshu.com/p/67bcb481d1c5 Element https://www.kkpan.com/article/1845.html
- Python之进程、线程、协程篇
本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者 ...
- Windows下配置ChromeDriver
1.查看自己chrome浏览器的版本. 浏览器地址栏输入以下地址 chrome://version 2.通过自己的版本下载相应的chromedriver.exe 下载地址:http://npm.tao ...
- 什么?你正在学web自动化测试?那这些Selenium的基本操作你了解过吗?
在自动化测试中,我们都知道是通过定位元素来实现的,那么有时候我们定位元素定位不到是为什么呢? 1.页面出现了iframe 2.出现了新的窗口,没有实现句柄的切换 3.三种等待方式,没有选择其中之一来使 ...
- Ethical Hacking - NETWORK PENETRATION TESTING(10)
WPA Craking WPA was designed to address the issues in WEP and provide better encryption. The main is ...