Description

小Y喜欢速度与激情,于是他参加了地下车会。  地下车会设有N 个
分赛区,M种赛事。每个分赛区有C[i]场比赛。由于地下车会经营者
想要赚到更多的钱,规定小 Y 必须参加某一些赛区的一些赛事。且
每个赛区至少参加L[i]场比赛。小Y不想在一个地区逗留太久惹上麻
烦,所以每个赛区他最多参加P[i]场比赛。可能是因为经营者对新手
有歧视心理,规定了小 Y 每种赛事最多只能进行 A[i]场比赛。小 Y
这个月资金有点紧张,他算了算自己最多只能够维护车子跑 K 场比
赛。由于小 Y 是新手,所以他希望积累更多的经验,也就是跑尽可
能多的赛事。

Input

第一行三个数N,M,K,用空格隔开。 
接下来N行,每行第一个数C[i],接下来 C[i]个数,代表每场比赛的
种类,种类可能重复。 
接下来一行一个数F,代表规定条数。 
接下来 F 行,每行两个数 A,B,代表小 Y 必须参加 A 赛区的 B 种
赛事一次及以上。一种规定只会出现一次。 
接下来一行M个数,代表A[i]。 
接下来N行,每行两个数P[i],L[i]。

Output

第一行一个数ans,表示小Y最多能跑几场赛事。

Sample Input

5 5 15
5 1 1 2 2 3
6 2 2 3 4 5 5
3 1 2 3
6 1 2 3 4 5 5
4 3 3 4 4
3
1 2
2 5
5 3
2 2 3 2 3
4 2
4 2
2 1
5 3
3 1

Sample Output

12

HINT

前 100% 的数据, 1<=N<=500 , 1<=M<=500 , 1<=C[i]<=500 ,

1<=F<=100000

【友情提示】

对于所有的数据, 1<=L[i]<=P[i]<=C[i], 1<=A[i]<=10^4, K<= 200000,

数据保证合法。

Solution

依题意构图,跑上下界最大流。

Code

 #include <cstdio>
#include <cstring>
#include <algorithm> #define maxn 510
#define R register
#define inf 0x7fffffff
#define dmin(_a, _b) ((_a) < (_b) ? (_a) : (_b))
int id2[maxn], id3[maxn], tot, num[maxn][maxn];
int s, t, ans, deg[maxn << ];
bool req[maxn][maxn];
struct Edge {
Edge *next, *rev;
int to, cap;
} *cur[maxn << ], *last[maxn << ], e[maxn * maxn << ], *ecnt = e;
inline void link(R int a, R int b, R int w)
{
*++ecnt = (Edge) {last[a], ecnt + , b, w}; last[a] = ecnt;
*++ecnt = (Edge) {last[b], ecnt - , a, }; last[b] = ecnt;
}
int q[maxn << ], dep[maxn << ];
inline bool bfs()
{
memset(dep, -, (t + ) << );
R int head = , tail = ; dep[q[] = t] = ;
while (head < tail)
{
R int now = q[++head];
for (R Edge *iter = last[now]; iter; iter = iter -> next)
if (iter -> rev -> cap && dep[iter -> to] == -)
dep[q[++tail] = iter -> to] = dep[now] + ;
}
return dep[s] != -;
}
int dfs(R int x, R int f)
{
if (x == t) return f;
R int used = ;
for (R Edge* &iter = cur[x]; iter; iter = iter -> next)
if (iter -> cap && dep[iter -> to] + == dep[x])
{
R int v = dfs(iter -> to, dmin(f - used, iter -> cap));
iter -> cap -= v;
iter -> rev -> cap += v;
used += v;
if (f == used) return f;
}
return used;
}
void dinic()
{
while (bfs())
{
memcpy(cur, last, sizeof last);
ans += dfs(s, inf);
}
}
int main()
{
R int n, m, k; tot = ; scanf("%d%d%d", &n, &m, &k); link(s, , k);
for (R int i = ; i <= m; ++i) id3[i] = ++tot;
for (R int i = ; i <= n; ++i)
{
R int c; scanf("%d", &c);
id2[i] = ++tot;
for (R int j = ; j <= c; ++j)
{
R int x; scanf("%d", &x);
++num[i][x];
}
}
R int F; scanf("%d", &F);
for (R int i = ; i <= F; ++i)
{
R int a, b; scanf("%d%d", &a, &b); req[a][b] = ;
}
t = ++tot;
for (R int i = ; i <= m; ++i)
{
R int a; scanf("%d", &a);
link(id3[i], t, a);
}
for (R int i = ; i <= n; ++i)
{
R int p, l; scanf("%d%d", &p, &l);
link(, id2[i], p - l); deg[] += l; deg[id2[i]] -= l;
}
for (R int i = ; i <= n; ++i)
for (R int j = ; j <= m; ++j)
if (req[i][j])
{
link(id2[i], id3[j], num[i][j] - );
++deg[id2[i]]; --deg[id3[j]];
}
else if (num[i][j]) link(id2[i], id3[j], num[i][j]);
R int os = s, ot = t; link(t, s, inf);
s = ++tot; t = ++tot;
for (R int i = ; i <= tot; ++i) deg[i] > ? link(i, t, deg[i]) : link(s, i, -deg[i]);
dinic();
s = os; t = ot; ans = ;
dinic();
printf("%d\n", ans);
return ;
}

【BZOJ2409】 地下车会的更多相关文章

  1. 斐讯路由器L(联)B(壁)K-码兑换包安全下车通道(图文教程)

    大家好,最近大家比较关心的斐讯路由器如何下车问题,楼主亲自试提取了一遍,记录下过程,欢迎大家一起讨论. 言归正传,上图,上图! No.1 打开斐讯提供的良心k码退换通道: https://tech-s ...

  2. Emergency Evacuation(最短下车时间)———(思维)

    题意: 给你一个车厢和一些人的位置,这些人都坐在座位上,求这些人全部出去的时间最小值. 注意: 有许多行座位,且每行关于过道对称,出口在过道一端,一个时间只能移动一个单位,且每时刻每个格子只能有一人 ...

  3. 传播正能量——做一个快乐的程序员

    引子 今天在博客园看到施瓦小辛格的文章我们搞开发的为什么会感觉到累,顿时有感而发.自己本来不擅长写文章,更不擅长写这种非技术性的文章,但是在思绪喷薄之际,还是止不住有很多话要说.针对从客观上说&quo ...

  4. 就这么漂来漂去---一个毕业三个月的java程序员的裸辞风波

    注:这并不是一篇技术文章,而是记录了我这几个月经历的入职,裸辞,找工作的心路历程,简单介绍一个博主的情况,我是16年毕业生,校招进了一家北京的公司,java开发,和很多年轻人一样,干了一段时间,我发现 ...

  5. 站在风口,你或许就是那年薪20w+的程序猿

    最近面试了一些人,也在群上跟一些群友聊起,发现现在的互联网真是热,一些工作才两三年的期望的薪资都是十几K的起,这真是让我们这些早几年就成为程序猿的情何以堪!正所谓是站在风口上,猪也能飞起来!我在这里就 ...

  6. thusc2016游记&&滚粗记&&酱油记

    #include <cstdio> using namespace std; int main(){ puts("转载请注明出处:http://www.cnblogs.com/w ...

  7. 精通Web Analytics 2.0 (11) 第九章: 新兴分析—社交,移动和视频

    精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第九章: 新兴分析-社交,移动和视频 网络在过去几年中发生了不可思议的发展变化:从单向对话到双向对话的转变; 由视频,Ajax和 ...

  8. codevs 2287 火车站

    2287 火车站  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 钻石 Diamond     题目描述 Description 火车从始发站(称为第1站)开出,在始发站上车的人 ...

  9. php 远程本地化无后缀图片

    $body = '<p style="margin: 0px 0px 1.1em; padding: 0px; color: rgb(51, 51, 51); font-family: ...

随机推荐

  1. MSF魔鬼训练营-3.1.2信息收集-通过搜索引擎进行信息搜集

    1.Google hacking 技术 自动化的Google搜索工具 SiteDigger https://www.mcafee.com/us/downloads/free-tools/sitedig ...

  2. zabbix监控大数据

    参考: https://github.com/Staroon/zabbix-hadoop-template 支持监控HDFS.NameNode, YARN ResourceManager, Hive, ...

  3. spring boot-16.使用redis做缓存

    spring boot 自动配置了多种 缓存管理器,按照下面的顺序查找,如果容器中有相应的组件,则使用相应的缓存管理器. Generic JCache (JSR-107) EhCache 2.x Ha ...

  4. Vue 子组件,向父组件传递。

  5. 修建泳池&最大子矩阵

    [题目描述] 夏天到了,学校打算在教学楼后面的空地上挖一个泳池供大家使用. 经过实地勘察,这块土地可以划分成N 行M 列的方格,有的方格是树,有的方格是空地.现在要找一块最大的矩形空地修建泳池,请问泳 ...

  6. C++的左值,右值,左值引用,右值引用

    参考大神链接: https://blog.csdn.net/u012198575/article/details/83142419 1.左值与右值 https://msdn.microsoft.com ...

  7. mysql-5.7.25安装以及使用

    1. wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz 2. ...

  8. RabbitMQ入门教程(十七):消息队列的应用场景和常见的消息队列之间的比较

    原文:RabbitMQ入门教程(十七):消息队列的应用场景和常见的消息队列之间的比较 分享一个朋友的人工智能教程.比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看. 这是网上的一篇教程写的很好,不知原作 ...

  9. centos:mysql主从同步配置(2018)

    centos:mysql主从同步配置(2018) https://blog.csdn.net/liubo_2016/article/details/82379115 主服务器:10.1.1.144; ...

  10. oracle中的表空间以及和表空间有关的操作

    oracle中表空间 表空间是oracle对物理数据库上相关数据文件的逻辑映射.一个数据库逻辑上被划分成一个或若干个表空间,每个表空间包含了在逻辑上相关联的一组结构.每个数据库至少有一个表空间(sys ...