【洛谷 P2754】 [CTSC1999]家园(最大流)
题目链接
突然发现Dinic很好写诶。。
第一次数组开小了,玄学\(WA\),what?数据范围描述有误?
分层图,每天为一层。
把上一天的每个空间站向这一天连一条流量为inf的边,表示可以原地不动。
把一个周期内上一天上一个和这一天这一个连一条流量为这艘太空船的容量的边,表示去下一站。
然后每次加一天,看什么时候最大流达到\(k\)就行了。
#include <cstdio>
#include <queue>
using namespace std;
#define INF 2147483647
inline int read(){
int s = 0, w = 1;
char ch = getchar();
while(ch < '0' || ch > '9'){if(ch == '-')w = -1;ch = getchar();}
while(ch >= '0' && ch <= '9') s = s * 10 + ch - '0',ch = getchar();
return s * w;
}
const int MAXN = 1000010;
struct Edge{
int next, from, to, rest;
}e[MAXN];
int head[MAXN], num = 1;
inline void Add(int from, int to, int flow){
//printf("%d %d\n", from, to);
e[++num] = (Edge){ head[from], from, to, flow }; head[from] = num;
e[++num] = (Edge){ head[to], to, from, 0 }; head[to] = num;
}
int flow[MAXN], pre[MAXN], dfn[MAXN];
int h[MAXN], p[MAXN], f[100][100];
int n, m, k, s, t, sum, now, Time;
queue <int> q;
int RoadExist(){
while(q.size()) q.pop();
flow[s] = INF; pre[t] = 0; q.push(s); dfn[s] = ++Time;
while(q.size()){
now = q.front(); q.pop();
for(int i = head[now]; i; i = e[i].next)
if(e[i].rest && dfn[e[i].to] != Time)
dfn[e[i].to] = Time, flow[e[i].to] = min(flow[now], e[i].rest), q.push(e[i].to), pre[e[i].to] = i;
}
return pre[t];
}
int dinic(){
int ans = 0;
while(RoadExist()){
ans += flow[t];
now = t;
while(now != s){
e[pre[now]].rest -= flow[t];
e[pre[now] ^ 1].rest += flow[t];
now = e[pre[now]].from;
}
}
return ans;
}
int main(){
n = read() + 2; m = read(); k = read();
s = 99999; t = 100000;
for(int i = 1; i <= m; ++i){
h[i] = read(); p[i] = read();
for(int j = 0; j < p[i]; ++j)
f[i][j] = read() + 1;
}
Add(s, 1, INF); Add(0, t, INF);
for(int i = 1; i <= 500; ++i){
Add(s, n * i + 1, INF); Add(n * i, t, INF);
for(int j = 0; j < n; ++j) Add(n * (i - 1) + j, n * i + j, INF);
for(int j = 1; j <= m; ++j){
int x = f[j][(i - 1) % p[j]], y = f[j][i % p[j]];
Add((i - 1) * n + x, i * n + y, h[j]);
}
if((sum += dinic()) >= k){
printf("%d\n", i);
return 0;
}
}
printf("0\n");
return 0;
}
【洛谷 P2754】 [CTSC1999]家园(最大流)的更多相关文章
- 洛谷P2754 [CTSC1999]家园(最大流)
传送门 这题思路太强了……大佬们怎么想到的……我这菜鸡根本想不出来…… 先判断是否能到达,对每一艘飞船能到的地方用并查集合并一下,最后判断一下是否连通 然后考虑几天怎么判断,我们可以枚举. 每一个点表 ...
- 洛谷P2754 [CTSC1999]家园
题目链接:https://www.luogu.org/problemnew/show/P2754 知识点: 最大流 解题思路: 先用 \(DFS\) 判断是否无解. 从时刻 \(0\) 开始枚举答案, ...
- 洛谷2754 [CTSC1999]家园
题目链接:[CTSC1999]家园 这个题目我们不是很好在做网络流的时候判断是否有解,因此我们考虑分开来做 对于是否有解的判断,我们唯一需要解决的是飞船的周期停泊问题,对于这个问题,我们可以用并查集解 ...
- 网络流24题之星际转移问题(洛谷P2754)
洛谷 P2754 题目背景 none! 题目描述 由于人类对自然资源的消耗,人们意识到大约在 2300 年之后,地球就不能再居住了.于是在月球上建立了新的绿地,以便在需要时移民.令人意想不到的是,21 ...
- 洛谷.4015.运输问题(SPFA费用流)
题目链接 嗯..水题 洛谷这网络流二十四题的难度评价真神奇.. #include <queue> #include <cstdio> #include <cctype&g ...
- 洛谷 P2754 星际转移问题【最大流】
判无解的方法非常粗暴:快T了还是没有合法方案,就是无解. 然后枚举答案,对于每一天都建一套太空站,s连地球,t连月球,上一天的太空站连向这一天的太空站,流量均为inf.然后对于每个飞船,上一天的停靠站 ...
- 洛谷P3381 最小费用最大流
费用流板子 还是一道板子题..先练练手 #include <bits/stdc++.h> #define INF 0x3f3f3f3f #define full(a, b) memset( ...
- 洛谷P4015 运输问题(费用流)
传送门 源点向仓库连费用$0$,流量为储量的边,商店向汇点连费用$0$,流量为需求的边,然后仓库向商店连流量$inf$,费用对应的边,跑个费用流即可 //minamoto #include<io ...
- 洛谷P4014 分配问题(费用流)
传送门 可以把原图看做一个二分图,人在左边,任务在右边,求一个带权的最大和最小完美匹配 然而我并不会二分图做法,所以只好直接用费用流套进去,求一个最小费用最大流和最大费用最大流即可 //minamot ...
随机推荐
- 【OSG】 报错:丢失osg100-osgDB.dll
如果你bin目录已经添加到了环境变量的path里面,还报这个错的话. 或许你重启一下电脑就可以了..我就这么解决的.
- 【week4】技术随笔psp
本周psp
- tweenjs缓动算法使用小实例
这里的tweenjs不是依托于createjs的tewwnjs,而是一系列缓动算法集合.因为本身是算法,可以用在各个业务场景中,这也正是总结学习它的价值所在.tweenjs代码详情: /* * Twe ...
- 使用图片方式显示email地址
import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics2D ...
- VC学习笔记:对话框
VC学习笔记:对话框 SkySeraph NOV.11st 2009 HQU Email-zgzhaobo@gmail.com QQ-452728574 Latest Modified Date:O ...
- [剑指Offer] 46.孩子们的游戏
题目描述 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他随机指 ...
- error C2143: 语法错误 : 缺少“;”(在“类型”的前面)
C编程老是遇到这个问题: 错误 error C2143: 语法错误 : 缺少“;”(在“类型”的前面) d:\kinectproject\ceshiglad\ceshiglad\shili.c ces ...
- MATLAB中的randi函数
randi Pseudorandom integers from a uniform discrete distribution.来自一个均匀离散分布的伪随机整数 R = randi(IMAX,N) ...
- 【bzoj4540】[Hnoi2016]序列 单调栈+离线+扫描线+树状数组区间修改区间查询
题目描述 给出一个序列,多次询问一个区间的所有子区间最小值之和. 输入 输入文件的第一行包含两个整数n和q,分别代表序列长度和询问数.接下来一行,包含n个整数,以空格隔开,第i个整数为ai,即序列第i ...
- [SP8372-TSUM]Triple Sums
题面在这里 description 某\(B\)姓\(OJ\)权限题 给出\(n\)个正整数\(a[i]\),求\(i<j<k\)且\(S=a[i]+a[j]+a[k]\)的三元组\((i ...