2016 ACM/ICPC ECNA Regional I.Waif Until Dark(最大流)
这是一道ECNA的16年题,问有n个小朋友,m个玩具,不同孩子有不同喜好的玩具,每个玩具可能属于一个类别,同一类别的玩具最多只能用一定次数,问最大匹配
这个就很裸的二分图,掏出dinic板子,首先最后问的是孩子,所以最后一层肯定是孩子,然后有玩具,所以玩具是和孩子连边的,有种类,那种类和玩具连边,然后如果不属于任何一组的玩具边的容量就是1,与源连上,如果属于的话就和组连上,容量为最大限制,孩子和终点连边,跑一次dinic就行了,easy
#include <bits/stdc++.h>
using namespace std;
#define limit (90000 + 5)//防止溢出
#define INF 0x3f3f3f3f
#define inf 0x3f3f3f3f3f
#define lowbit(i) i&(-i)//一步两步
#define EPS 1e-6
#define FASTIO ios::sync_with_stdio(false);cin.tie(0);
#define ff(a) printf("%d\n",a );
#define pi(a,b) pair<a,b>
#define rep(i, a, b) for(ll i = a; i <= b ; ++i)
#define per(i, a, b) for(ll i = b ; i >= a ; --i)
#define MOD 998244353
#define traverse(u) for(int i = head[u]; ~i ; i = edge[i].next)
#define FOPEN freopen("C:\\Users\\tiany\\CLionProjects\\acm_01\\data.txt", "rt", stdin)
#define FOUT freopen("C:\\Users\\tiany\\CLionProjects\\acm_01\\dabiao.txt", "wt", stdout)
#define debug(x) cout<<x<<endl
typedef long long ll;
typedef unsigned long long ull;
inline ll read(){
ll sign = 1, x = 0;char s = getchar();
while(s > '9' || s < '0' ){if(s == '-')sign = -1;s = getchar();}
while(s >= '0' && s <= '9'){x = (x << 3) + (x << 1) + s - '0';s = getchar();}
return x * sign;
}//快读
void write(ll x){
if(x < 0) putchar('-'),x = -x;
if(x / 10) write(x / 10);
putchar(x % 10 + '0');
}
int n,m,vs,ve,p;
int layer[limit],head[limit], cnt;
struct node{
int to ,next;
ll flow, w;
}edge[limit];
ll max_flow;
void add_one(int u , int v, ll flow = 0){
edge[cnt].to = v;
edge[cnt].next = head[u];
edge[cnt].flow = flow;
edge[cnt].w = 0;
head[u] = cnt++;
}
inline void add(int u, int v, ll flow){
add_one(u,v,flow);
add_one(v, u,0);
}
inline void init(bool flag = true){
if(flag){
memset(head, -1, sizeof(head));
cnt = 0;
}else{
memset(layer, -1, sizeof(layer));
}
}
inline bool bfs(){
init(false);
queue<int>q;
layer[vs] = 0;//从第0层开始
q.push(vs);
while (q.size()){
int u = q.front();
q.pop();
traverse(u){
int v = edge[i].to,flow = edge[i].flow;
if(layer[v] == -1 && flow > 0){
layer[v] = layer[u] + 1;//迭代加深
q.push(v);
}
}
}
return ~layer[ve];
}
ll dfs(int u, ll flow){
if(u == ve)return flow;
ll rev_flow = 0,min_flow;
traverse(u){
int v =edge[i].to;
ll t_flow = edge[i].flow;
if(layer[v] == layer[u] + 1 && t_flow > 0){
min_flow = dfs(v, min(flow, t_flow));
flow -= min_flow;
edge[i].flow -= min_flow;
rev_flow += min_flow;
edge[i^1].flow += min_flow;
if(!flow)break;
}
}
if(!rev_flow)layer[u] = -1;
return rev_flow;
}
void dinic(){
while (bfs()){
max_flow += dfs(vs,inf);
}
}
int vis[limit];
int main() {
#ifdef LOCAL
FOPEN;
#endif
init();
n = read(), m = read(), p = read();
vs = 80001, ve = vs + 1;
rep(i, 1,n){
add(m + p + i, ve, 1);//孩子
}
rep(i ,1,n){
//连孩子和玩具
int op = read();
while (op--){
int num_toy = read();
add(p + num_toy , m + p + i, 1);
}
}
rep(q,1,p){
int l = read();
while (l--){
int x = read();
vis[x] = 1;
add(q, p + x, 1);
}
int r = read();
add(vs,q,r);
}
rep(i ,1,m)if(!vis[i])add(vs, p + i, 1);
dinic();
write(max_flow);
return 0;
}
2016 ACM/ICPC ECNA Regional I.Waif Until Dark(最大流)的更多相关文章
- 2016 ACM/ICPC Asia Regional Shenyang Online 1003/HDU 5894 数学/组合数/逆元
hannnnah_j’s Biological Test Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K ...
- 2016 ACM/ICPC Asia Regional Qingdao Online 1001/HDU5878 打表二分
I Count Two Three Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- 2016 ACM/ICPC Asia Regional Shenyang Online 1009/HDU 5900 区间dp
QSC and Master Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...
- 2016 ACM/ICPC Asia Regional Shenyang Online 1007/HDU 5898 数位dp
odd-even number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- 2016 ACM/ICPC Asia Regional Dalian Online 1002/HDU 5869
Different GCD Subarray Query Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K ( ...
- 2016 ACM/ICPC Asia Regional Dalian Online 1006 /HDU 5873
Football Games Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)To ...
- HDU 5874 Friends and Enemies 【构造】 (2016 ACM/ICPC Asia Regional Dalian Online)
Friends and Enemies Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Othe ...
- HDU 5889 Barricade 【BFS+最小割 网络流】(2016 ACM/ICPC Asia Regional Qingdao Online)
Barricade Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- HDU 5875 Function 【倍增】 (2016 ACM/ICPC Asia Regional Dalian Online)
Function Time Limit: 7000/3500 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
随机推荐
- 832. Flipping an Image —— weekly contest 84
Flipping an Image Given a binary matrix A, we want to flip the image horizontally, then invert it, a ...
- 对比JAVA、Python、C、Go运行时间,我惊呆了!!!
对比JAVA.Python.C.Go运行时间,我惊呆了!!! 周末在寝室刷完算法,想放松一下,于是做了一个实验:用现在主流的几种编程语言对0 - (10000000 - 1)求和,结果我惊呆了,话不多 ...
- 模板——Splay
$Splay$ #include <bits/stdc++.h> #define inf (int)1e9 using namespace std; const int N=1e5+100 ...
- Pycharm激活码(2020最新永久激活码)
如果下边的Pycharm激活码过期失效了的话,大家可以关注我的微信公众号:Python联盟,然后回复"激活码"即可获取最新Pycharm永久激活码! 56NPDDVEIV-eyJs ...
- 微服务接口设计(RESTful规范)
微服务的接口设计(RESTful规范) 基本知识 URI:在RESTful架构中,每个URI代表一种资源 URI规范: 不用大写 用中杠-,不用下划线_ 路径中不能有动词,只能有名词 名词表示资源集合 ...
- linux 中断softirq tasklet
硬中断为什么不能休眠--- 中断线程以及软中断解决了什么问题---- 软中断cb函数是否允许相应本地中断,什么时候开启中断关闭中断---- 什么是软中断上下文------- 什么是tasklet 和软 ...
- JAVA注解的继承性
摘要 本文从三个方面介绍java注解的**"继承性"**: 基于元注解@Inherited,类上注解的继承性 基于类的继承,方法/属性上注解的继承性 基于接口的继承/实现,方法/属 ...
- jsp 和servlet基础知识
1 在tomcat服务器当中,4**表示客户端请求错误,5**表示程序错误 2.request知识参考网址:http://wenku.baidu.com/link?url=wYwTGk8XKrLzA ...
- C#高级编程之泛型二(泛型类型约束、类型、反射与泛型)
泛型类型约束 简言之:对泛型类型进行约束,细化,限定. MSDN的定义:泛型定义中的 where 子句指定对用作泛型类型.方法.委托或本地函数中类型参数的参数类型的约束,意思就是可以有泛型类.泛型方法 ...
- JPA、Hibernate、Spring-Data-Jpa的本质区别
什么是JPA? 全称Java Persistence API,可以通过注解或者XML描述[对象-关系表]之间的映射关系,并将实体对象持久化到数据库中. 为我们提供了: 1)ORM映射元数据:JPA支持 ...