«问题描述:

由于人类对自然资源的消耗,人们意识到大约在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. Java发出声卡蜂鸣生的方法

    方法一: Toolkit.getDefaultToolkit().beep(); 方法二: System.out.println('\007');//八进制数

  2. 单例Singleton

    先提供一个完整版: // .h文件 @interface SingleTon : NSObject /** 获取单例对象 */ + (instancetype)sharedInstance; + (i ...

  3. k8s的pv和pvc简述

    pvc:资源需要指定:1.accessMode:访问模型:对象列表:    ReadWriteOnce – the volume can be mounted as read-write by a s ...

  4. mysql安装记录

    一.创建mysql用户 useradd mysql 二.解压 tar -zxvf mysql-5.6.38.tar.gz 三.安装依赖包 yum install -y ncurses-devel li ...

  5. CentOS 7 bonding模式双网卡绑定

    1.1    查看系统内核是否支持bonding [root@cobbler-node1 ~]# cat /boot/config-3.10.0-693.el7.x86_64 | grep -i bo ...

  6. 【CodeBase】通过层级键在多维数组中获取目标值

    通过层级键在多维数组中获取目标值 /* *Author : @YunGaZeon *Date : 2017.08.09 *param data : Data Array *param keys : K ...

  7. ob缓存的基本使用

    在页面 加载的时候 如果 图片 很多 很大 会造成页面的阻塞降低用户体验 我们在点击页面的时候可以使用OB缓存 整个页面, 当用户点击的时候直接请求的是我们预先准备好的html页面 .也降低了我们数据 ...

  8. Python开发不可不知的虚拟环境

    一.python3.3之后自带的venv模块 1. 创建虚拟环境 python3.6 -m venv project-env 2. 加入虚拟环境目录 cd pronject-env 3. 激活虚拟环境 ...

  9. A1012 The Best Rank (25)(25 分)

    A1012 The Best Rank (25)(25 分) To evaluate the performance of our first year CS majored students, we ...

  10. 洛谷 P3740 [HAOI2014]贴海报

    题目描述 Bytetown城市要进行市长竞选,所有的选民可以畅所欲言地对竞选市长的候选人发表言论.为了统一管理,城市委员会为选民准备了一个张贴海报的electoral墙. 张贴规则如下: electo ...