«问题描述:

由于人类对自然资源的消耗,人们意识到大约在2300 年之后,地球就不能再居住了。
于是在月球上建立了新的绿地,以便在需要时移民。令人意想不到的是,2177 年冬由于未
知的原因,地球环境发生了连锁崩溃,人类必须在最短的时间内迁往月球。现有n个太空站
位于地球与月球之间,且有m 艘公共交通太空船在其间来回穿梭。每个太空站可容纳无限
多的人,而每艘太空船i 只可容纳H[i]个人。每艘太空船将周期性地停靠一系列的太空站,
例如:(1,3,4)表示该太空船将周期性地停靠太空站134134134…。每一艘太空船从一个太
空站驶往任一太空站耗时均为1。人们只能在太空船停靠太空站(或月球、地球)时上、下船。
初始时所有人全在地球上,太空船全在初始站。试设计一个算法,找出让所有人尽快地全部
转移到月球上的运输方案。

«编程任务:

对于给定的太空船的信息,找到让所有人尽快地全部转移到月球上的运输方案。
«数据输入:
由文件home.in提供输入数据。文件第1行有3 个正整数n(太空站个数),m(太空船
个数)和k(需要运送的地球上的人的个数)。其中 1<=m<=20, 1<=n<=13, 1<=k<=50。
接下来的m行给出太空船的信息。第i+1 行说明太空船pi。第1 个数表示pi 可容纳的
人数Hpi;第2 个数表示pi 一个周期停靠的太空站个数r,1<=r<=n+2;随后r 个数是停靠
的太空站的编号(Si1,Si2,…,Sir),地球用0 表示,月球用-1 表示。时刻0 时,所有太空船都
在初始站,然后开始运行。在时刻1,2,3…等正点时刻各艘太空船停靠相应的太空站。人
只有在0,1,2…等正点时刻才能上下太空船。

«结果输出:

程序运行结束时,将全部人员安全转移所需的时间输出到文件home.out中。如果问题
无解,则输出0。

输入文件示例 输出文件示例

home.in
2 2 1
1 3 0 1 2

1 3 1 2 -1

home.out

5

/*
二分答案,然后转为判断性问题,对于这个题,可以直接枚举。
我们可以看出每一天都是独立的,而且每一次转移都是跨天的,所以把每一天单独处理成一个点。
建图方法:
1.从源点向每一天的地球链接一条inf。
2.从每一天的月亮向汇点链接一条inf。
3.从上一天的每一个节点向当天的对应节点链接一条inf(人们可以留在中转站等一等)。
4.针对每一艘飞船,找到上一天的位置和这一天的位置,在这两个点之间连一条容量为飞船满载人数的边。
*/
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#define N 10010
#define inf 1000000000
using namespace std;
int p[],r[],a[][],n,m,k;
int head[N],dis[N],S,T=,cnt=;
struct node{int v,f,pre;}e[N*];
queue<int> q;
void add(int u,int v,int f){
e[++cnt].v=v;e[cnt].f=f;e[cnt].pre=head[u];head[u]=cnt;
e[++cnt].v=u;e[cnt].f=;e[cnt].pre=head[v];head[v]=cnt;
}
bool bfs(){
memset(dis,-,sizeof(dis));
q.push(S);dis[S]=;
while(!q.empty()){
int u=q.front();q.pop();
for(int i=head[u];i;i=e[i].pre)
if(e[i].f&&dis[e[i].v]==-){
dis[e[i].v]=dis[u]+;
q.push(e[i].v);
}
}
return dis[T]!=-;
}
int dinic(int x,int f){
if(x==T) return f;
int rest=f;
for(int i=head[x];i;i=e[i].pre)
if(e[i].f&&dis[e[i].v]==dis[x]+){
int t=dinic(e[i].v,min(e[i].f,rest));
if(!t) dis[e[i].v]=-;
e[i].f-=t;
e[i^].f+=t;
rest-=t;
}
return f-rest;
}
int main(){
freopen("home.in","r",stdin);
freopen("home.out","w",stdout);
scanf("%d%d%d",&n,&m,&k);n+=;
for(int i=;i<=m;i++){
scanf("%d%d",&p[i],&r[i]);
for(int j=;j<r[i];j++)
scanf("%d",&a[i][j]),a[i][j]+=;
}
int ans=,flow=;
while(){
if(ans==) break;
add(ans*n+,T,inf);
add(S,ans*n+,inf);
if(ans){
for(int i=;i<=n;i++)
add((ans-)*n+i,ans*n+i,inf);
for(int i=;i<=m;i++){
int x=a[i][(ans-)%r[i]];
int y=a[i][ans%r[i]];
add((ans-)*n+x,ans*n+y,p[i]);
}
}
while(bfs())
flow+=dinic(S,inf);
if(flow>=k) break;
ans++;
}
if(ans==) printf("");
else printf("%d",ans);
return ;
}

星际转移(cogs 736)的更多相关文章

  1. 线性规划与网络流24题●09方格取数问题&13星际转移问题

    ●(做codevs1908时,发现测试数据也涵盖了1907,想要一并做了,但因为“技术”不佳,搞了一上午) ●09方格取数问题(codevs1907  方格取数3) 想了半天,也没成功建好图: 无奈下 ...

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

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

  3. Luogu P2754 星际转移问题

    Luogu P2754 星际转移问题 思路 首先,对于地球能否到达月球的问题,考虑使用并查集维护. 对于每艘飞船能够到达的站点,放进一个集合里,若两艘飞船的集合有交集,那么就合并两个集合,最后只要地球 ...

  4. 【网络流24题】No. 13 星际转移问题 (网络判定 最大流)

    [题意] 由于人类对自然资源的消耗, 人们意识到大约在 2300 年之后, 地球就不能再居住了.于是在月球上建立了新的绿地,以便在需要时移民. 令人意想不到的是, 2177 年冬由于未知的原因, 地球 ...

  5. [CTSC1999]【网络流24题】星际转移

    Description 由于人类对自然资源的消耗,人们意识到大约在2300 年之后,地球就不能再居住了.于是在月球上建立了新的绿地,以便在需要时移民.令人意想不到的是,2177 年冬由于未知的原因,地 ...

  6. 【刷题】LOJ 6015 「网络流 24 题」星际转移

    题目描述 由于人类对自然资源的消耗,人们意识到大约在 2300 年之后,地球就不能再居住了.于是在月球上建立了新的绿地,以便在需要时移民.令人意想不到的是,2177 年冬由于未知的原因,地球环境发生了 ...

  7. 网络流24题之星际转移问题(洛谷P2754)

    洛谷 P2754 题目背景 none! 题目描述 由于人类对自然资源的消耗,人们意识到大约在 2300 年之后,地球就不能再居住了.于是在月球上建立了新的绿地,以便在需要时移民.令人意想不到的是,21 ...

  8. 洛谷.2754.星际转移问题(最大流Dinic 分层)

    题目链接 枚举时间 每一个时间点 对于每个之前的位置像当前位置连边,表示这一时刻可待在原地 每艘船 之前时刻位置向当前时刻连边 注意别漏了0时刻src连向earth的边 #include<cst ...

  9. luogu2754 星际转移问题

    源向地球连 月球向汇连 每一天往下一天连 飞船上一天与这一天连 枚举答案 #include <iostream> #include <cstring> #include < ...

随机推荐

  1. es6展开运算符

    数组的展开合并 现在有两个数组[1, 2, 3, 4]和[5, 6, 7],想要将两个函数拼接成一个新的函数. //es5的写法 let arr1 = [1, 2, 3, 4]; let arr2 = ...

  2. 爬虫学习(六)——异常处理URLerrors异常处理

    # 异常处理都在urllib.error中进行处理 import urllib.requestimport urllib.error # 第一种异常:该网址不存在url = "http:// ...

  3. 二、Linux 系统启动过程

    Linux 系统启动过程 linux启动时我们会看到许多启动信息. Linux系统的启动过程并不是大家想象中的那么复杂,其过程可以分为5个阶段: 内核的引导. 运行 init. 系统初始化. 建立终端 ...

  4. BootStrap下拉框搜索功能

    <!DOCTYPE html> <html> <head> <title>jQuery bootstrap-select可搜索多选下拉列表插件-www. ...

  5. float浮动布局(慕课网CSS笔记 + css核心技术详解第四章)

    ---------------------------------------------------------------------- CSS中的position: CSS三种布局方式: 标准流 ...

  6. JZOJ 3223. 【HBOI2013】Ede的新背包问题

    3223. [HBOI2013]Ede的新背包问题 (Standard IO) Time Limits: 2000 ms  Memory Limits: 262144 KB  Detailed Lim ...

  7. 1568: [JSOI2008]Blue Mary开公司(超哥线段树)

    1568: [JSOI2008]Blue Mary开公司 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 1198  Solved: 418 Descr ...

  8. Linux设置运行core dump

    系统配置vim /etc/sysctl.conf kernel.core_uses_pid = kernel.core_pattern = %e-core-%p-%t sysctl -p检查有没有生效 ...

  9. loj2090 「ZJOI2016」旅行者

    分治+最短路,很套路的 #include <algorithm> #include <iostream> #include <cstring> #include & ...

  10. Struts之上传

    上传的jsp写法: <tr> <td width="50%" align="left">软件上传: <input type=&qu ...