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 ... 
随机推荐
- Android 视频播放器 NurVideoPlayer ()
			我在实战项目中用了它. 更新了2.x.x版本ijkplayer的封装 支持屏幕滑动--滑动时间,亮度,声音,进度,支持全屏-单屏,双击暂停--继续,锁定屏幕,支持HTTP和https,也可以控制声道( ... 
- c#连接mysql答题步骤
			引用mysql数据库 using MySql.Data.MySqlClient; 有一个mysql.dll文件 下面是实例化连接数据库 MySqlConnection Conn = new MySql ... 
- Elasticsearch 注册windows服务后,服务启动失败,意外终止
			直接双击elasticsearch.bat可以成功启动,注册成服务后就启动失败 从网上查找问题,发现是jdk版本的问题,用ES自带的jdk就可以启动成功. 默认ES会先找JAVA_HOME环境变量,如 ... 
- 用DOM和DOM4J写xml文件时,怎样设置xml文档的编码
			//在将xml文档传输出去时,利用Transformer中的setOutputProperty方法 TransformerFactory trans = TransformerFactory.newI ... 
- 为什么使用MongoDB
			MongoDB vs MySQL Nosql vs RDBMS(关系型数据库) MongoDB采用类似Json的形式存储数据而不是结构性的表 MongoDB的分片机制支持海量数据的存储和扩展,并有完整 ... 
- 《.NET 5.0 背锅案》第5集-案情大转弯:都是我们的错,让 .NET 5.0 背锅
			第1集:验证 .NET 5.0 正式版 docker 镜像问题 第2集:码中的小窟窿,背后的大坑,发现重要嫌犯 EnyimMemcachedCore 第3集-剧情反转:EnyimMemcachedCo ... 
- mysql之索引组织表
			1.二叉树/平衡树.B-tree.B+tree.B*tree 树:最上一层是根节点.最底下一层是叶子节点.(一般左边节点小于右边节点) 二叉树:每个节点最多只能有两个分支,一般只用于教材.二叉树的深度 ... 
- 再聊 Blazor,它是否值得你花时间学习
			之前写了一篇文章<快速了解 ASP.NET Core Blazor>,大家关心最多的问题是,我该不该花时间去学习 Blazor.今天聊聊这个话题,并表达一下我个人的看法. 在此之前,我还是 ... 
- 一张900w的数据表,16s执行的SQL优化到300ms?
			一,前言 证实 有一张财务流水表,未分库分表,目前的数据量为9555695,分页查询使用到了limit,优化之前的查询耗时16 s 938 ms (execution: 16 s 831 ms, fe ... 
- java的常用定时任务的几种方式
			Java基本的定时任务,一般有这几种方式:一.Timer 1 public class Timer{ 2 static int index=0; 3 public static void main(S ... 
