[CTSC1999]家园

时空限制1000ms / 128MB

题目背景

none!

题目描述

由于人类对自然资源的消耗,人们意识到大约在 2300 年之后,地球就不能再居住了。于是在月球上建立了新的绿地,以便在需要时移民。令人意想不到的是,2177 年冬由于未知的原因,地球环境发生了连锁崩溃,人类必须在最短的时间内迁往月球。

现有 n 个太空站位于地球与月球之间,且有 m 艘公共交通太空船在其间来回穿梭。每个太空站可容纳无限多的人,而每艘太空船 i 只可容纳 H[i]个人。每艘太空船将周期性地停靠一系列的太空站,例如:(1,3,4)表示该太空船将周期性地停靠太空站 134134134…。每一艘太空船从一个太空站驶往任一太空站耗时均为 1。人们只能在太空船停靠太空站(或月球、地球)时上、下船。

初始时所有人全在地球上,太空船全在初始站。试设计一个算法,找出让所有人尽快地全部转移到月球上的运输方案。

对于给定的太空船的信息,找到让所有人尽快地全部转移到月球上的运输方案。

输入输出格式

输入格式:

第 1 行有 3 个正整数 n(太空站个数),m(太空船个数)和 k(需要运送的地球上的人的个数)。其中 n<=13 m<=20, 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…等正点时刻才能上下太空船。

输出格式:

程序运行结束时,将全部人员安全转移所需的时间输出。如果问题

无解,则输出 0。

输入输出样例

输入样例:

2 2 1
1 3 0 1 2
1 3 1 2 -1

输出样例:

5

说明

题目链接:https://www.luogu.org/problemnew/show/P2754


分层图+最大流。这个题目的难点在于不同时间时,图中的边也是不同的,因此我们可以对每一时间都建一层图,层之间按照题目的约束建边,即若某一时间太空船在点u,下一时刻到点v,我们就在当前时刻对应的层的u点和下一时刻对应的层的v点之间连一条容量为太空船容量的边,又因为太空站可以容纳无限多的人,所以对于当前层的点,还要与下一层对应的点连一条容量为INF的边。最后超级源点与每一层的地球连边,每一层的月球与超级汇点连边。这样建图,每增加一层图,就代表时间加一。我们先把无解的情况用并查集判出,然后边建图边跑最大流,直到最大流量大于给定的人数为止。

#include<bits/stdc++.h>
#define INF LLONG_MAX/2
#define N 10005
using namespace std;typedef struct
{int to,next;long long flow;
}ss;ss edg[N*4];
int now_edge=0,s,t;
int head[N];void addedge(int u,int v,long long flow)
{edg[now_edge]=(ss){v,head[u],flow};head[u]=now_edge++;edg[now_edge]=(ss){u,head[v],0};head[v]=now_edge++;
}int dis[N];bool bfs()
{memset(dis,0,sizeof(dis));queue<int>q;q.push(s);dis[s]=1;while(!q.empty()){int now=q.front();q.pop();for(int i=head[now];i!=-1;i=edg[i].next){ss &e=edg[i];if(e.flow>0&&dis[e.to]==0){dis[e.to]=dis[now]+1;q.push(e.to);}}}if(dis[t]==0)return 0;return 1;
}int current[N];
long long dfs(int x,long long maxflow)
{if(x==t)return maxflow;
//    printf("%d %lld\n",x,maxflow);for(int i=current[x];i!=-1;i=edg[i].next){current[x]=i;ss &e=edg[i];if(e.flow>0&&dis[e.to]==dis[x]+1){long long flow=dfs(e.to,min(maxflow,e.flow));if(flow!=0){e.flow-=flow;edg[i^1].flow+=flow;return flow;}}}return 0;
}long long dinic()
{long long ans=0,flow;while(bfs()){for(int i=0;i<N;i++)current[i]=head[i];while(flow=dfs(s,INF))ans+=flow;}return ans;
}int cap[25];
int si[25][50];int pre[N];int Find(int x)
{int boss=x;while(boss!=pre[boss])boss=pre[boss];;while(x!=boss){int now=pre[x];pre[x]=boss;x=now;}return boss;
}void init()
{now_edge=0;memset(head,-1,sizeof(head));for(int i=0;i<N;i++)pre[i]=i;
}int main()
{init();int n,m,k;scanf("%d %d %d",&n,&m,&k);for(int i=1;i<=m;i++){scanf("%d %d",&cap[i],&si[i][0]);for(int j=1;j<=si[i][0];j++)scanf("%d",&si[i][j]);}for(int i=1;i<=m;i++)for(int j=1;j<si[i][0];j++){int u=si[i][j],v=si[i][j+1];if(u==0)u=n+1;elseif(u==-1)u=n+2;if(v==0)v=n+1;elseif(v==-1)v=n+2;pre[Find(u)]=Find(v);}if(Find(n+1)!=Find(n+2)){printf("0\n");return 0;}s=N-3,t=N-2;addedge(s,n+1,INF);addedge(n+2,t,INF);int now=dinic(),flo=1;while(now<k){for(int i=1;i<=m;i++){int  t=(flo%si[i][0]==0) ? si[i][si[i][0]] : si[i][flo%si[i][0]];int tt=((flo+1)%si[i][0]==0) ? si[i][si[i][0]] : si[i][(flo+1)%si[i][0]];int u,v;if(t==0)u=(flo-1)*(n+2)+n+1;elseif(t==-1)u=(flo-1)*(n+2)+n+2;elseu=(flo-1)*(n+2)+t;if(tt==0)v=(flo)*(n+2)+n+1;elseif(tt==-1)v=(flo)*(n+2)+n+2;elsev=(flo)*(n+2)+tt;// printf("%d %d %d %d %d %d\n",t,tt,u,v,flo,cap[i]);//  system("pause");
            addedge(u,v,cap[i]);addedge((flo-1)*(n+2)+i,flo*(n+2)+i,INF);}addedge(s,flo*(n+2)+n+1,INF);addedge(flo*(n+2)+n+2,t,INF);flo++;now+=dinic();//printf("%d \n",now);// system("pause");
    }printf("%d\n",flo-1);return 0;}

View Code

转载于:https://www.cnblogs.com/tian-luo/p/9709106.html

网络流24题-[CTSC1999]家园相关推荐

  1. [线性规划与网络流24题] 网络流常见模型

    最近两个月在做<线性规划与网络流24题>这套题,加深了对网络流的理解. 涵盖到的模型有:二分图匹配.二分图的最大独立集.最大权闭合图.有向无环图的最小路径覆盖.最多不相交路径.最大权不相交 ...

  2. 解题报告:线性规划与网络流24题

    目录 A.飞行员配对方案问题 (二分图最大匹配)(最大流)[提高+/省选- ] B.太空飞行计划问题(最大权闭合图转最小割.最小割方案输出)[省选/NOI- ] C.最小路径覆盖问题(有向无环图最小路 ...

  3. 「网络流24题」 12. 软件补丁问题

    「网络流24题」 12. 软件补丁问题 状压 DP,SPFA 转移. 没错,跟网络流没任何关系. b1.b2.f1.f2 都用二进制存下来,第 i 位表示是否有这个错误. 然后从每位都是 1 到 0 ...

  4. loj #6226. 「网络流 24 题」骑士共存问题

    #6226. 「网络流 24 题」骑士共存问题 题目描述 在一个 n×n\text{n} \times \text{n}n×n 个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上某些 ...

  5. 【线性规划与网络流24题】孤岛营救问题 分层图

    孤岛营救问题 Time Limit: 1 Sec  Memory Limit: 128 MB Description 1944年,特种兵麦克接到国防部的命令.要求马上赶赴太平洋上的一个孤岛,营救被敌军 ...

  6. Cogs 727. [网络流24题] 太空飞行计划(最大权闭合子图)

    [网络流24题] 太空飞行计划 ★★☆ 输入文件:shuttle.in 输出文件:shuttle.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] W 教授正在为国家航天中心计 ...

  7. 【线性规划与网络流24题】汽车加油行驶问题 分层图

    汽车加油行驶问题 Time Limit: 1 Sec  Memory Limit: 128 MB Description 给定一个 N*N的方形网格,设其左上角为起点◎,坐标为( 1,1),X轴向右为 ...

  8. 【网络流24题】魔术球问题(最大流)

    [网络流24题]魔术球问题(最大流) 题面 Cogs 题解 是不是像极了最小路径覆盖? 因此,我们枚举放到哪一个球(也可以二分) 然后类似于最小路径覆盖的连边 因为一根柱子对应一个路径的覆盖 所以,提 ...

  9. 734. [网络流24题] 方格取数问题 二分图点权最大独立集/最小割/最大流

    «问题描述: 在一个有m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任 意2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法. «编程任务: 对于给定 ...

最新文章

  1. 通知 | 首届中国心电智能大赛复赛开启
  2. 人工智能 60 年技术简史
  3. ffmpeg 源码学习
  4. Oracle CheckPoint进程
  5. ListString 和 ArrayListString的区别
  6. Atitit.解决org.hibernate.DuplicateMappingException: Duplicate class/entity mapping
  7. 判断回文串时忽略既非字母又非数字的字符
  8. 吴恩达深度学习神经网络基础编程作业Python Basics with Numpy
  9. 执行Linux脚本出错,出现No Such file or directory异常
  10. 解决:PHP Deprecated: Comments starting with '#' are deprecated in ……
  11. struts2框架之拦截器(参考第二天学习笔记)
  12. YUV格式到底是什么?
  13. 如何轻松集成VARCHART XGantt
  14. JQ实现多checkbox选一清其它
  15. InnoDB Buffer Pool 缓冲池详解
  16. Pearl Pairing
  17. 众所周知的广告屏蔽神器uBlock/Adguard,为啥你装上后和没装一样?
  18. NodeMCU-ESP8266烧录手把手教程
  19. Android怎么实现数字增减,Android实现数字跳动效果的TextView方法示例
  20. 案例:同程凤凰缓存系统基于Redis的设计与实践。

热门文章

  1. 高铁服务要学的计算机是什么,高铁乘务员需要具备那些知识
  2. 如何基于Flink+TensorFlow打造实时智能异常检测平台?只看这一篇就够了
  3. 2019年秦皇岛J题:MUV LUV EXTRA(KMP后缀数组)
  4. java 操作 User32 的一次小尝试
  5. 【网络小说推荐】宗教裁判所
  6. 快来,百度云应用型BLB全区公测上线了
  7. VS2010 MFC TextOut垂直显示内容的显示、清除和修改
  8. 学习笔记:matplotlib数据可视化
  9. python 按姓名排序excel
  10. 51单片机驱动TCS3200颜色识别传感器