【题解】CTSC1999家园(网络流)
CTSC1999家园
建模方法类似我NOI2019网络同步赛我的T1写法[【题解】NOI2019Route](70分)
问题的焦点是:空间时间载具。
考虑如何击破时间限制,可以对每个点关于每个时刻建立一个点,这样就实现一个点在两个时间互不干扰。由于时间是流淌的,所以从过去到现在连一条免费的\(inf\)边
此时空间问题也就解决了,比较空间就是具体的节点。
考虑载具,载具就相当于一个时刻在新建边的东西,我们直接枚举时间让他慢慢加点就好了。注意到载具总要从上个时间连接到这个时间,相当于虫洞?
下面这个图会非常清楚:
写的话有点麻烦,模块化编程就稍微好写点。数据范围不超过100,不用怕MLE,TLE。
发现一种很好用的调试技巧,就是在add函数中输出fr to w 等等内容,按照这个提示建图就可以很快发现问题。
//@winlere
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std; typedef long long ll;
inline int qr(){
register int ret=0,f=0;
register char c=getchar();
while(c<48||c>57)f|=c==45,c=getchar();
while(c>=48&&c<=57) ret=ret*10+c-48,c=getchar();
return f?-ret:ret;
}
const int maxn=5e4+5;
struct E{
int to,nx,w;
E(){to=nx=w=0;}
E(const int&a,const int&b,const int&c){to=a;nx=b;w=c;}
}e[maxn];
int head[maxn];
int last[maxn];
int lastlast[maxn];
int cnt=1;
int n,m,k;
int nodecnt;
int S,T;
const int inf=0x3f3f3f3f;
inline void add(const int&fr,const int&to,const int&w,const int&f=1){
e[++cnt]=E(to,head[fr],w);
head[fr]=cnt;
if(f) add(to,fr,0,0);
}
queue < int > q;
int d[maxn],cur[maxn];
inline bool bfs(){
for(register int t=1;t<=nodecnt;++t) d[t]=0,cur[t]=head[t];
d[S]=1;q.push(S);
while(q.size()){
register int now=q.front();
q.pop();
//cout<<"now="<<now<<' '<<T<<endl;
for(register int t=head[now];t;t=e[t].nx){
if(e[t].w>0&&d[e[t].to]==0){
d[e[t].to]=d[now]+1;
q.push(e[t].to);
}
}
}
return d[T];
}
int dfs(const int&now,int fl){
if(now==T||fl==0)return fl;
register int ret=0;
for(register int&t=cur[now];t;t=e[t].nx){
if(e[t].w>0&&d[e[t].to]==d[now]+1){
int d=dfs(e[t].to,min(e[t].w,fl));
e[t].w-=d;e[t^1].w+=d;ret+=d;fl-=d;
}
}
return ret;
}
inline int dinic(){
register int ret=0;
while(bfs()) ret+=dfs(S,inf);
return ret;
}
int sh[205][205];
int siz[205];
int stay[205];
int cap[205];
inline void init(){
S=++nodecnt;
T=++nodecnt;
for(register int t=1;t<=n+2;++t) last[t]=++nodecnt;
add(S,last[n+1],k);
}
inline void update(const int&now){
for(register int t=1;t<=n+2;++t)
add(lastlast[t]=last[t],++nodecnt,inf),last[t]=nodecnt;
for(register int t=1;t<=m;++t){
int la=stay[t];
int to=(stay[t]+1)%siz[t];
add(lastlast[sh[t][la]],last[sh[t][to]],cap[t]);
stay[t]=to;
}
add(last[n+2],T,inf);
}
namespace binc{
int r[201];
int n;
inline void init(int a){n=a;for(int t=1;t<=n;++t) r[t]=t;}
int q(int a){return a==r[a]?a:r[a]=q(r[a]);}
void j(int a,int b){r[q(a)]=q(b);}
}
int main(){
n=qr();m=qr();k=qr();
binc::init(n+2);
for(register int t=1;t<=m;++t){
cap[t]=qr();
siz[t]=qr();
for(register int i=0;i<siz[t];++i){
sh[t][i]=qr();
if(sh[t][i]==0)sh[t][i]=n+1;
if(sh[t][i]==-1)sh[t][i]=n+2;
if(i)binc::j(sh[t][i],sh[t][i-1]);
}
}
if(binc::q(n+1)!=binc::q(n+2)) return puts("0"),0;
int timenow=0,sum=0,t1,cnt=0;
init();
while(sum<k){
update(++timenow);
t1=dinic();
sum+=t1;
if(t1==0&&sum)++cnt;
}
printf("%d\n",timenow);
return 0;
}
【题解】CTSC1999家园(网络流)的更多相关文章
- 洛谷2754 [CTSC1999]家园
题目链接:[CTSC1999]家园 这个题目我们不是很好在做网络流的时候判断是否有解,因此我们考虑分开来做 对于是否有解的判断,我们唯一需要解决的是飞船的周期停泊问题,对于这个问题,我们可以用并查集解 ...
- 【题解】【网络流24题】航空路线问题 [P2770] [Loj6122]
[题解][网络流24题]航空路线问题 [P2770] [Loj6122] 传送门:航空路线问题 \([P2770]\) \([Loj6122]\) [题目描述] 给出一张有向图,每个点(除了起点 \( ...
- 【题解】【网络流24题】汽车加油行驶问题 [P4009] [Loj6223]
[题解][网络流24题]汽车加油行驶问题 [P4009] [Loj6223] 传送门:汽车加油行驶问题 \([P4009]\) \([Loj6223]\) [题目描述] 给出一个 \(N \times ...
- [网络流24题][CTSC1999] 家园
题目链接:戳我 对于这种一个点(表面意义上的一个点,比如说一个位置)对应多种情况的(比如说随着时间的推移有着不同的状态,而且这种状态>2),我们考虑在类似于分层图上面跑网络流. 比如说这道题,周 ...
- 网络流24题 P2754 [CTSC1999]家园
思路 如图,建立分层图跑dinic 每次在残余网络里加边继续跑 跑到ans>=k时候的i就是答案 诶呀啊,忘记弄箭头了,最后一列是向上的箭头,不过聪明的你们应该没啥影响 代码 #include ...
- [CTSC1999]家园 分层图网络流_并查集
Code: #include<cstdio> #include<vector> #include<algorithm> #include<queue> ...
- 洛谷P2754 [CTSC1999]家园(最大流)
传送门 这题思路太强了……大佬们怎么想到的……我这菜鸡根本想不出来…… 先判断是否能到达,对每一艘飞船能到的地方用并查集合并一下,最后判断一下是否连通 然后考虑几天怎么判断,我们可以枚举. 每一个点表 ...
- P2754 [CTSC1999]家园
传送门 人在各个太空站流动,所以显然的网络流模型 因为不同时间能走的边不同,所以显然按时间拆点 但是因为不知道要多少时间,所以要枚举时间,动态拆点 每一点向下一个时间的同一点连流量为 $INF$ 的边 ...
- [CTSC1999]【网络流24题】星际转移
Description 由于人类对自然资源的消耗,人们意识到大约在2300 年之后,地球就不能再居住了.于是在月球上建立了新的绿地,以便在需要时移民.令人意想不到的是,2177 年冬由于未知的原因,地 ...
随机推荐
- js中字符串拼接html
1.使用转义字符 ": " " "+userName+" " " 效果:"userName" 2. 单引号中拼 ...
- List of open source software
List of open source software https://www.ibm.com/developerworks/community/wikis/home?lang=en#!/wiki/ ...
- APICloud原生APP中ajax需要用api.ajax
报错截屏: APICloud原生APP中ajax请求需要用api.ajax(api对象的ajax方法来替代),否则会将引起请求失败. APICloud api.ajax
- cesium 基础
scaleByDistance : new Cesium.NearFarScalar(1.5e2, 1.5, 8.0e6, 0.0),--(近值,近端放大率,远值,远端放大率) 给定距离视点的近值和远 ...
- 如何创建私有pod三方库
1.先登录github或者开源中国码云,创建远程仓库,用来存放库文件代码 仓库创建完成,得到远程仓库地址,并保存备用 2.创建本地代码库 打开终端,cd到你想创建的文件夹下,使用命令:pod lib ...
- Codeforces Round #185 (Div. 1 + Div. 2)
A. Whose sentence is it? 模拟. B. Archer \[pro=\frac{a}{b}+(1-\frac{a}{b})(1-\frac{c}{d})\frac{a}{b}+( ...
- CF1166E The LCMs Must be Large
CF1166E The LCMs Must be Large 构造趣题 正着推其实很不好推 不妨大力猜结论 如果两两集合都有交,那么一定可以 证明: 1.显然如果两个集合没有交,一定不可以 2.否则给 ...
- 京东基于Spark的风控系统架构实践和技术细节
京东基于Spark的风控系统架构实践和技术细节 时间 2016-06-02 09:36:32 炼数成金 原文 http://www.dataguru.cn/article-9419-1.html ...
- vue创建脚手架 cil
1.检查环境是否安装好了!node -vnpm -vnpm install cnpm -g --registry=https://registry.npm.taobao.orgcpm -v (版本与n ...
- Django入门5--URL传递参数