思路

如图,建立分层图跑dinic

每次在残余网络里加边继续跑

跑到ans>=k时候的i就是答案

诶呀啊,忘记弄箭头了,最后一列是向上的箭头,不过聪明的你们应该没啥影响

代码

#include <bits/stdc++.h>
#define FOR(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
const int N = 1e6 + 7;
const int inf = 0x3f3f3f3f;
int read() {
int x=0,f=1;char s=getchar();
for(;s>'9'||s<'0';s=getchar()) if(s=='-') f = -1;
for(;s>='0'&&s<='9';s=getchar()) x = x*10 + s - '0';
return x*f;
}
int n, m, k, h[100], S, T;
std::vector<int> G[100];
struct node {
int v, nxt, cap;
}e[N];
int head[N], tot = 1;
void add_edge(int u, int v, int cap) {
e[++tot].v = v;
e[tot].cap = cap;
e[tot].nxt = head[u];
head[u] = tot;
}
int dis[N];
queue <int> Q;
bool bfs() {
memset(dis, -1, sizeof(dis));
while(!Q.empty()) Q.pop();
dis[S] = 0;
Q.push(S);
while(!Q.empty()) {
int u = Q.front();
Q.pop();
for(int i = head[u]; i;i = e[i].nxt) {
int v = e[i].v;
if(dis[v] == -1 && e[i].cap) {
dis[v] = dis[u] + 1;
Q.push(v);
}
}
}
return dis[T] != -1;
}
int dfs(int now, int f) {
if(now == T) return f;
int rest = f;
for(int i = head[now]; i;i = e[i].nxt) {
int v = e[i].v;
if(dis[v] == dis[now] + 1 && e[i].cap && rest) {
int t = dfs(v, min(e[i].cap, rest));
if(!t) dis[v] = 0;
e[i].cap -= t;
e[i^1].cap += t;
rest -= t;
}
}
return f-rest;
}
namespace bcj {
int siz[N], f[N];
int find(int x) {
return x == f[x] ? x : f[x] = find(f[x]);
}
void uu(int x, int y) {
int fx = find(x), fy = find(y);
if(siz[fx] <= siz[fy]) {
f[fx] = fy;
if(siz[fx] == siz[fy]) siz[fy] ++;
} else f[fy] = fx;
}
}
int main() {
n = read() ,m = read(), k = read();
S = 5e5+1, T = 5e5+2;
FOR(i,1,1000) bcj::f[i] = i;
FOR(i, 1, m) {
h[i] = read();
int x = read();
FOR(j, 1, x) {
int tmp = read();
if(tmp==0) tmp = n+1;
if(tmp==-1) tmp = n+2;
G[i].push_back(tmp);
}
}
FOR(i,1,m) {
for(std::vector<int>::iterator it = G[i].begin() + 1; it != G[i].end(); ++ it) {
bcj::uu(*it, *(it-1));
}
}
if(bcj::find(n+1) != bcj::find(n+2)) {puts("0"); return 0;}
int ans = 0,i = 1;
add_edge(S, n + 1, inf);
add_edge(n + 1, S, 0); add_edge(n + 2, T, inf);
add_edge(T, n + 2, 0);
for(;; ++i) {
// my -> my
FOR(j, 1, n + 1) {
add_edge(j + (i-1) * (n + 2), j + i * (n + 2), inf);
add_edge(j + i * (n + 2), j + (i-1) * (n + 2), 0);
}
add_edge((i + 1) * (n + 2), i * (n + 2), inf);
add_edge(i * (n + 2), (i + 1) * (n + 2), 0);
// go go go
FOR(j, 1, m) {
int a = i % G[j].size() - 1;
int b = i % G[j].size();
a= a<0 ? G[j].size()-1 : a;
a =G[j][a] + (i - 1) * (n + 2);
b =G[j][b] + i * (n + 2);
add_edge(a, b, h[j]);
add_edge(b, a, 0);
}
while(bfs()) ans += dfs(S,inf);
if(ans >= k) break;
}
printf("%d\n", i);
return 0;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. CJOJ 1494 【网络流24题】 搭配飞行员(二分图最大匹配)

    CJOJ 1494 [网络流24题] 搭配飞行员(二分图最大匹配) Description 飞行大队有若干个来自各地的驾驶员,专门驾驶一种型号的飞机,这种飞机每架有两个驾驶员,需一个正驾驶员和一个副驾 ...

随机推荐

  1. java.lang.ClassNotFoundException: org.hibernate.engine.FilterDefinition的解决方案

    今天在GitHub上面看到一个有意思的项目,下载下来,使用tomcat部署失败,出现异常,网上说JDK版本太高,改低,还是失败. 由于本人有个习惯,更喜欢把项目直接放入tomcat webapps 里 ...

  2. 本地文件直接访问html,document.cookie总是显示空字符串

    当file:///E:/browser.html访问时,我们设置document.cookie,读取时一直会显示空字符串! 而开一下Apache时:localhost/browser.html或者12 ...

  3. keras可视化pydot graphviz问题

    Keras中提供了一个神经网络可视化的函数plot,并可以将可视化结果保存在本地.plot使用方法如下: from keras.utils.visualize_util import plot plo ...

  4. Django admin模块无法调用css样式文件

    在使用Django Admin开发时,发现admin模块css样式文件丢失,无法调用,使火狐浏览器提示: 此 URL 的资源不是文本: http://127.0.0.1:8000/statics/ad ...

  5. ubuntu14.04 cpu-ssd

    1. ssd-caffe部署 五年半前老笔记本,没有GPU(其实有,AMD的,不能装CUDA),之前装过CPU版的Caffe 新建一个目录,然后参考网上步骤 sudo git clone https: ...

  6. python pynssql创建表,删除表,插入数据,查询

    import pymssql server='10.194.**.***:*****' user='sa' password='******' database='******' #连接 conn=p ...

  7. Thread(26)

    1.进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 2.线程:线程是进程中的一个执行单元,负责当前进程中程序的执行, ...

  8. android studio 自动导入包

    android studio 自动导入包 一.Android studio 的导单个包的快捷键是Alt+Enter (需要选中要导入包的类名再按快捷键才起作用): 二.Android studio 可 ...

  9. AWS免费云服务套餐申请步骤及常见问题

    AWS免费云服务套餐申请步骤及常见问题 AWS免费使用套餐常见问题_AWS免费云服务套餐_-AWS云服务https://amazonaws-china.com/cn/free/faqs/ 什么是 AW ...

  10. usb通信小结

    2010-07-25 16:52:00 目前了解了usb通信层面的一些基础知识如下.如果有空还要再了解hid报告描述符及协议的数据包波形. 一,USB的一些基本概念 1. 管道(Pipe) 是主机和设 ...