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. [ASP.NET] 后台判断文本框输入内容是否为数字

    由于使用JS在前台对文本框内容进行检测后似乎会影响回传 故在后端进行对内容判断 代码示例: string abnormal_num = Abnormal_Num.Text;//獲取文本框的text值 ...

  2. 洛谷P1600 天天爱跑步——题解

    题目传送 首先要考虑入手点.先考虑一个一个玩家处理,显然不加优化的话,时间复杂度是O(n)的.发现对于玩家路径上的点都有一个观察员,一个都不能忽视,看起来是很难优化了.在做题时,发现一个思路很难想,就 ...

  3. Comet OJ - Contest #14

    Rank38. 还是比较不满意吧,C卡了太久,E没调出来,D也没空去做了. A 签到题. #include<bits/stdc++.h> using namespace std; #def ...

  4. vue render 渲染函数

    vue render 渲染函数 经常看到使用render渲染函数的示例,而且在一些特殊情况下,确实更好使用,可以更加有效地细分组件,因而借助vue-element-admin来学习一波 render函 ...

  5. RSA使用

    RSA使用 今天在跟同事一起调试TCP通讯的时候,在RSA私钥解密这块,着实让我费了一番心思. 流程大致是这样的,终端登录的时候使用固定的des密码加密数据发送,平台接收后确认登录信息后,会返回一个字 ...

  6. LOCATE()和FIND_IN_SET()

    locate(substr,str) 查找substr在str中第一次出现的位置,为空时返回0 SELECT login_name, LOCATE('ning',login_name) FROM us ...

  7. 7.利用canvas和js画一个渐变的

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  8. python接口测试—mysql数据库操作

    python操作mysql数据库 1.安装pymysql库 在python中安装pymysql第三方库,通过pip install pymysql 命令进行安装. 2.python操作mysql数据库 ...

  9. VMware 问题

    桥接模式下,小鸡上不了网问题 多网卡导致的问题 解决:编辑-虚拟网络编辑器 选择vmnet0,然后点击右下角更改设置 把自动改为指定要桥接的网卡,然后点击确定,测试看看.

  10. linux tar压缩解压命令的详细解释

    tar [-cxtzjvfpPN] 文件与目录 参数:-c :建立一个压缩文件的参数指令(create 的意思):-x :解开一个压缩文件的参数指令!-t :查看 tarfile 里面的文件!特别注意 ...