sgu438-The_Glorious_Karlutka_River
Description
SGU似乎死了... 题目搬到了Codeforces...
Problem - 99999438 - Codeforces
Solution
动态最大流.
考虑如果不求时间, 只求能否到达对岸, 这显然是一个拆点最大流.
如果加上时间的限制, 考虑按照时间拆点, 然后枚举时间 \(t\), 并且连上 \(t\) 时间能到达的点.
具体的, 设河的这一岸为 \(s\), 对岸为 \(t\). \(t\) 时刻的点 \(p\) 为 \(p_t\), 并拆成两个点 \(p_t'\), \(p_t''\).
对于 \(t\) 时刻, 连边 \((p_t', p_t'', c_p)\). 对于能到达 \(s\) 或 \(t\) 的节点, 分别连边 \((s, p_t',\infty)\), \((p_{t-1}'', t, \infty)\). 对于能互相到达的点 \(u, v\), 连边 \((u_{t-1}, v_t, \infty)\), \((v_{t-1}, u_t, \infty)\).
那么当总最大流 \(\ge m\) 时, 当前枚举的时间即为答案.
Code
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<set>
#include<map>
using namespace std;
#define rep(i,l,r) for(register int i=(l);i<=(r);++i)
#define repdo(i,l,r) for(register int i=(l);i>=(r);--i)
#define il inline
typedef double db;
typedef long long ll;
//---------------------------------------
const int nsz=60,n2sz=3050,psz=14050,esz=1e6+50,ninf=1e9+7;
int n,m,d,w,pos[nsz][3],link[nsz][2];
int pow2(int v){return v*v;}
struct te0{int f,t;}e0[n2sz];
int pe0=0;
struct te{int t,pr,fl;}edge[esz*2];
int hd[psz],pe=1,ss,tt,np;
void adde(int f,int t,int fl){edge[++pe]=(te){t,hd[f],fl};hd[f]=pe;}
void addsg(int f,int t,int fl){adde(f,t,fl),adde(t,f,0);}
int cur[psz],gap[psz],dep[psz];
void init(){
rep(i,1,np)cur[i]=hd[i],gap[i]=0,dep[i]=0;
static int que[psz],qh,qt;
qh=1,qt=0;
que[++qt]=tt,gap[1]=1,dep[tt]=1;
while(qh<=qt){
int u=que[qh++];
for(int i=hd[u],v;i;i=edge[i].pr){
v=edge[i].t;
if(dep[v])continue;
dep[v]=dep[u]+1,++gap[dep[v]],que[++qt]=v;
}
}
}
int dfs(int p,int mi){
if(p==tt||mi==0)return mi;
int fl=0,tmp;
for(int &i=cur[p],v;i;i=edge[i].pr){
v=edge[i].t;
if(dep[v]+1!=dep[p])continue;
tmp=dfs(v,min(mi,edge[i].fl));
fl+=tmp,mi-=tmp,edge[i].fl-=tmp,edge[i^1].fl+=tmp;
if(mi==0)return fl;
}
if(gap[dep[p]]==1)dep[ss]=np+1;
--gap[dep[p]],++dep[p],++gap[dep[p]];
cur[p]=hd[p];
return fl;
}
int maxfl(){
init();
int res=0;
while(dep[ss]<=np)res+=dfs(ss,ninf);
return res;
}
int tr(int p,int tm,int fl){//fl==0: from; fl==1: to
return (n*(tm-1)+p)*2-1+fl;
}
int sum=0;
int sol(){
if(d>=w)return 1;
else if(n==0)return -1;
ss=(n+m+5)*n*2+1,tt=(n+m+5)*n*2+2,np=tt;
rep(tm,1,n+m+1){
rep(i,1,n)if(link[i][0])addsg(ss,tr(i,tm,0),ninf);
if(tm>1)rep(i,1,n)if(link[i][1])addsg(tr(i,tm-1,1),tt,ninf);
rep(i,1,n)addsg(tr(i,tm,0),tr(i,tm,1),pos[i][2]);
if(tm>1){
rep(i,1,pe0){
addsg(tr(e0[i].f,tm-1,1),tr(e0[i].t,tm,0),ninf);
addsg(tr(e0[i].t,tm-1,1),tr(e0[i].f,tm,0),ninf);
}
}
sum+=maxfl();
// printf("tm=%d sum=%d\n",tm,sum);
if(sum>=m)return tm;
}
return -1;
}
int main(){
ios::sync_with_stdio(0),cin.tie(0);
cin>>n>>m>>d>>w;
rep(i,1,n)cin>>pos[i][0]>>pos[i][1]>>pos[i][2];
rep(i,1,n){
if(pos[i][1]<=d)link[i][0]=1;
if(pos[i][1]>=w-d)link[i][1]=1;
rep(j,i+1,n){
if(pow2(pos[i][0]-pos[j][0])+pow2(pos[i][1]-pos[j][1])<=pow2(d))e0[++pe0]=(te0){i,j};
}
}
int ans=sol();
if(ans==-1)cout<<"IMPOSSIBLE\n";
else cout<<ans<<'\n';
return 0;
}
sgu438-The_Glorious_Karlutka_River的更多相关文章
- SGU438 The Glorious Karlutka River =)(最大流)
题目大概说有m个人要过一条宽W的河,人最远跳远距离是d,河上有n个垃圾堆,每个垃圾堆都有坐标和同一时间能容纳的人数,问所有人最少要跳几次才能跳到对岸. 又是一题根据时间拆点的最大流. 二分时间建容量网 ...
- SGU438 The Glorious Karlutka River =)
传送门 sgu原来搬到cf了呀点了好几个链接才找到233 传说中的动态流(?) 反正很暴力就对了QwQ 有容量限制->拆点 对于每个点拆成入点和出点 时间限制->分层 对于每个时刻的每个石 ...
- The Glorious Karlutka River =)
sgu438:http://acm.sgu.ru/problem.php?contest=0&problem=438 题意:有一条东西向流淌的河,宽为 W,河中有 N 块石头,每块石头的坐标( ...
随机推荐
- vue点击按钮给商品按照价格进行倒叙
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- vue + elementUi + upLoadIamge组件 上传文件到阿里云oss
<template> <div class="upLoadIamge"> <el-upload action="https://jsonpl ...
- npm run dev 启动错误:Module build failed: Error: No PostCSS Config found in:xxxxxxxxxxxxxx
解决办法:在根目录新建postcss.config.js module.exports = { plugins: { 'autoprefixer': {browsers: 'last 5 versio ...
- 安装完成Dynamics 365 CE后别忘了更改维护作业的运行时间
摘要: 微软动态CRM专家罗勇 ,回复309或者20190308可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 安装完毕Dy ...
- Access denied for user 'root'@'localhost' (using password:YES) Mysql5.7
解决方案: (1) 打开MySQL目录下的my.ini文件,在文件的最后添加一行“skip-grant-tables”,保存并关闭文件.(my.ini在C:\ProgramData\MySQL\MyS ...
- Java新知识系列 八
什么是死锁,死锁的原因和必要条件: []什么是死锁,死锁的原因和必要条件: 死锁:死锁的原因在于进程在等待其它进程占有的某些资源,而自身的资源又被其它进程等待着,造成了死循环. 出现死锁的 ...
- cannot be run because the QueueReader subsystem failed to load
前阵子一数据库服务器的事务日志开始暴增,当时使用下面脚本检查发现该数据库的log_reuse_wait_desc 一直处于REPLICATION状态, 也就是说在事务复制过程中,与发布相关的事务仍未传 ...
- Spring MVC 表单校验 (七)
完整的项目案例: springmvc.zip 目录 实例 除了依赖spring-webmvc还需要依赖jackson-databind(用于转换json数据格式)和hibernate-validato ...
- 9102 IT人保持记忆力及健康的方法
做技术时间久了,我们会发现有的时候我们会感觉记忆力衰减太快,前脚刚忙完的事或者刚做完计划任务没多久就遗忘了,或者是以前轻车熟入的方法死活都记不起来了,亦或者之前学习一门技术很快就掌握真谛,现在即便花N ...
- SM4加密算法实现Java和C#相互加密解密
SM4加密算法实现Java和C#相互加密解密 近期由于项目需要使用SM4对数据进行加密,然后传给Java后台,Java后台使用的也是SM4的加密算法但是就是解密不正确,经过一步步调试发现Java中好多 ...