这是一道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(最大流)的更多相关文章

  1. 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 ...

  2. 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 ...

  3. 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) ...

  4. 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 ...

  5. 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 ( ...

  6. 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 ...

  7. 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 ...

  8. 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 ...

  9. 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 ...

随机推荐

  1. Android 视频播放器 NurVideoPlayer ()

    我在实战项目中用了它. 更新了2.x.x版本ijkplayer的封装 支持屏幕滑动--滑动时间,亮度,声音,进度,支持全屏-单屏,双击暂停--继续,锁定屏幕,支持HTTP和https,也可以控制声道( ...

  2. c#连接mysql答题步骤

    引用mysql数据库 using MySql.Data.MySqlClient; 有一个mysql.dll文件 下面是实例化连接数据库 MySqlConnection Conn = new MySql ...

  3. Elasticsearch 注册windows服务后,服务启动失败,意外终止

    直接双击elasticsearch.bat可以成功启动,注册成服务后就启动失败 从网上查找问题,发现是jdk版本的问题,用ES自带的jdk就可以启动成功. 默认ES会先找JAVA_HOME环境变量,如 ...

  4. 用DOM和DOM4J写xml文件时,怎样设置xml文档的编码

    //在将xml文档传输出去时,利用Transformer中的setOutputProperty方法 TransformerFactory trans = TransformerFactory.newI ...

  5. 为什么使用MongoDB

    MongoDB vs MySQL Nosql vs RDBMS(关系型数据库) MongoDB采用类似Json的形式存储数据而不是结构性的表 MongoDB的分片机制支持海量数据的存储和扩展,并有完整 ...

  6. 《.NET 5.0 背锅案》第5集-案情大转弯:都是我们的错,让 .NET 5.0 背锅

    第1集:验证 .NET 5.0 正式版 docker 镜像问题 第2集:码中的小窟窿,背后的大坑,发现重要嫌犯 EnyimMemcachedCore 第3集-剧情反转:EnyimMemcachedCo ...

  7. mysql之索引组织表

    1.二叉树/平衡树.B-tree.B+tree.B*tree 树:最上一层是根节点.最底下一层是叶子节点.(一般左边节点小于右边节点) 二叉树:每个节点最多只能有两个分支,一般只用于教材.二叉树的深度 ...

  8. 再聊 Blazor,它是否值得你花时间学习

    之前写了一篇文章<快速了解 ASP.NET Core Blazor>,大家关心最多的问题是,我该不该花时间去学习 Blazor.今天聊聊这个话题,并表达一下我个人的看法. 在此之前,我还是 ...

  9. 一张900w的数据表,16s执行的SQL优化到300ms?

    一,前言 证实 有一张财务流水表,未分库分表,目前的数据量为9555695,分页查询使用到了limit,优化之前的查询耗时16 s 938 ms (execution: 16 s 831 ms, fe ...

  10. java的常用定时任务的几种方式

    Java基本的定时任务,一般有这几种方式:一.Timer 1 public class Timer{ 2 static int index=0; 3 public static void main(S ...