题目:洛谷P2754。

题目大意:
有$n$个空间站,$m$个飞船,每个飞船有各自的停靠站点,并且从第一个停靠站点开始,不断循环。每个飞船有不同的容量(-1为月球,0为地球)。每个飞船初始停在第一个停靠站上,每过1s就会到下一个停靠站。
在空间站上的人可以选择上飞船,也可以选择不上飞船。
现在有$k$个人要从地球到月球去,问至少要过多少秒(无解输出$0$)。
解题思路:
由于每一时刻状态都是不同的,而数据规模比较小,可以考虑网络流建分层图。
枚举答案,每次从源点向当前状态的地球连一条容量inf的边,从当前状态向下一状态连一条容量为inf的边(人可以站在空间站而不一定要上船)。
再对每个飞船,从当前状态停靠站向下一状态的下一停靠站连一条容量为飞船容量的边。
然后每次加完边,都在原来的残量网络上跑网络流,并累计流量。当某一次得到的流量大于等于$k$时,输出答案即可。
无解的情况,只需要定一个答案上界(如1000),当超过上界时就判为无解,输出0即可。

C++ Code:

#include<bits/stdc++.h>
#define moon 23333
struct edge{
int to,nxt,cap;
}e[5000000];
inline int readint(){
int c=getchar(),d=0,b=0;
for(;!isdigit(c);c=getchar())b=c=='-';
for(;isdigit(c);c=getchar())
d=(d<<3)+(d<<1)+(c^'0');
return b?-d:d;
}
int n,m,k,head[100000],cnt=1,iter[100000],level[100000],flow=0;
inline void addedge(int u,int v,int flow){
e[++cnt]=(edge){v,head[u],flow};
head[u]=cnt;
e[++cnt]=(edge){u,head[v],0};
head[v]=cnt;
}
struct boat{
int h,sz,a[1000],now;
}p[100];
std::queue<int>q;
void bfs(){
q.push(0);
memset(level,-1,sizeof level);
level[0]=0;
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=head[u];i!=-1;i=e[i].nxt)
if(level[e[i].to]==-1&&e[i].cap>0){
level[e[i].to]=level[u]+1;
q.push(e[i].to);
}
}
}
int dfs(int u,int t,int f){
if(u==t)return f;
for(int &i=iter[u];i!=-1;i=e[i].nxt){
if(e[i].cap>0&&level[e[i].to]>level[u]){
int d=dfs(e[i].to,t,std::min(f,e[i].cap));
if(d){
e[i].cap-=d;
e[i^1].cap+=d;
return d;
}
}
}
return 0;
}
void dinic(){
for(;;){
memcpy(iter,head,sizeof iter);
bfs();
if(level[moon]==-1)return;
int f;
while(f=dfs(0,moon,0x3f3f3f3f))flow+=f;
}
}
int main(){
std::ios::sync_with_stdio(0);
n=readint(),m=readint(),k=readint();
memset(head,-1,sizeof head);
for(int i=1;i<=m;++i){
p[i].h=readint(),p[i].sz=readint();
p[i].now=1;
for(int j=1;j<=p[i].sz;++j)p[i].a[j]=readint();
}
std::cout.tie(0);
for(int ans=1;ans<=1000;++ans){
addedge(0,(n+1)*(ans-1)+1,0x3f3f3f3f);
for(int i=1;i<=n+1;++i)addedge((n+1)*(ans-1)+i+1,(n+1)*ans+i+1,0x3f3f3f3f);
for(int i=1;i<=m;++i){
int nxt=p[i].now+1;
if(nxt>p[i].sz)nxt=1;
int x=(n+1)*(ans-1)+p[i].a[p[i].now]+1,
y=(n+1)*ans+p[i].a[nxt]+1;
if(p[i].a[p[i].now]==-1)x=moon;
if(p[i].a[nxt]==-1)y=moon;
addedge(x,y,p[i].h);
p[i].now=nxt;
}
dinic();
if(flow>=k){
std::cout<<ans;
return EXIT_SUCCESS;
}
}
std::cout<<0;
return 0;
}

[CTSC1999][网络流24题]家园的更多相关文章

  1. [CTSC1999][网络流24题] 星际转移

    36. [CTSC1999][网络流24题] 星际转移 ★★★☆   输入文件:home.in   输出文件:home.out   简单对比时间限制:1 s   内存限制:128 MB «问题描述: ...

  2. [CTSC1999][网络流24题]补丁VS错误

    题目:洛谷P2761.vijos P1019.codevs1239.codevs2218. 题目大意:有n个错误,m个不同的补丁. 对于一个补丁,有两个不同的字符串描述.具体如下: 如果当前错误包含第 ...

  3. COGS743. [网络流24题] 最长k可重区间集

    743. [网络流24题] 最长k可重区间集 ★★★   输入文件:interv.in   输出文件:interv.out   简单对比时间限制:1 s   内存限制:128 MB «问题描述: «编 ...

  4. Cogs 14. [网络流24题] 搭配飞行员

    这道题其实蛮好想的,因为分为正,副飞行员.所以就把正飞行员当作Boy,副飞行员当作Girl.然后做Hungry即可. #include<bits/stdc++.h> using names ...

  5. 【线性规划与网络流 24题】已完成(3道题因为某些奇怪的原因被抛弃了QAQ)

    写在前面:SDOI2016 Round1滚粗后蒟蒻开始做网络流来自我拯救(2016-04-11再过几天就要考先修课,现在做网络流24题貌似没什么用←退役节奏) 做的题目将附上日期,见证我龟速刷题. 1 ...

  6. cogs_14_搭配飞行员_(二分图匹配+最大流,网络流24题#01)

    描述 http://cojs.tk/cogs/problem/problem.php?pid=14 有一些正飞行员和副飞行员,给出每个正飞行员可以和哪些副飞行员一起飞.一架飞机上必须一正一副,求最多多 ...

  7. BZOJ_1221_ [HNOI2001]_软件开发(最小费用流,网络流24题#10)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1221 n天,每天需要r个毛巾,用完以后可以洗,要么花fa洗a天,要么花fb洗b天,毛巾不够了可 ...

  8. 【网络流24题】 No.12 软件补丁问题(最小转移代价 最短路)

    [题意] T 公司发现其研制的一个软件中有 n 个错误, 随即为该软件发放了一批共 m 个补丁程序. 每一个补丁程序都有其特定的适用环境, 某个补丁只有在软件中包含某些错误而同时又不包含另一些错误时才 ...

  9. 【网络流24题】No.1 搭配飞行员(飞行员配对方案问题)

    [问题描述]     飞行大队有若干个来自各地的驾驶员,专门驾驶一种型号的飞机,这种飞机每架有两个驾驶员,需一个正驾驶员和一个副驾驶员.由于种种原因,例如相互配合的问题,有些驾驶员不能在同一架飞机上飞 ...

随机推荐

  1. Oracle 知识积累

    1.oracle存储过程中is和as的区别 在存储过程(PROCEDURE)和函数(FUNCTION)中没有区别,在视图(VIEW)中只能用AS不能用IS,在游标(CURSOR)中只能用IS不能用AS ...

  2. MySQL数据库中字段类型为tinyint,读取出来为true/false的问题

    由于MySQL中没有boolean类型,所以会用到tinyint类型来表示. 数据库一个表中有一个tinyint类型的字段,值为0或者1,如果取出来的话,0会变成false,1会变成true.

  3. [LeetCode] 75. 颜色分类(荷兰国旗)

    class Solution { public: void sortColors(vector<int>& nums) { ,current=,end=nums.size()-; ...

  4. 经纬度计算两点间的距离,根据距离排序SQL

    #java的Utilspublic class DistanceUtil { // 地球平均半径 private static final double EARTH_RADIUS = 6378137; ...

  5. 【hdu 6333】Harvest of Apples

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 假设T[i][j]表示的是杨辉三角第i层前j项的和. 会发现它同样满足杨辉三角的性质. 即 T[i][j] = T[i-1][j-1 ...

  6. Jquery学习总结(5)——jQuery选择器

    1. #id : 根据给定的ID匹配一个元素 <p id="myId">这是第一个p标签</p> <p id="not">这 ...

  7. eclipse 去掉Eclipse打开后定期弹出Usage Data Upload对话框

    Eclipse 的 UDC 老定期蹦出来说要上传使用数据到 eclipse 官网服务器去除方法: 1.删除 eclipse/plugins 目录下以 org.eclipse.epp.usagedata ...

  8. [SharePoint2010开发入门经典]创建你的第一个SPS2010程序

    本章概要: 1.创建一个解决方案,使他能读写数据从列表中,使用服务器端对象模型和可视的web部件 2.使用VS2010构建部署解决方案 3.使用图标web部件渲染列表数据 4.在一个解决方案中集成不同 ...

  9. UVA 4683 - Find The Number

    uva 4683 这题的意思是给一个集合,最多有12个元素. 找出仅仅能被集合中一个仅且一个数整除的第n个数. (n <= 10^15). 我用容斥原理做的.先把能被每一个数整除的元素个数累加, ...

  10. 第一篇、Android Supersu 权限管理定制,隐藏过滤权限,指定APP最高权限

    近期有个需求,在预装ROM的时候,须要权限,可是又不同意全部的应用都有权限,仅仅同意自己的应用有最高的权限(当然没有系统签名情况下). 所以.编译了CM 提取了supersu进行了二次定制,让他进行权 ...