题意:有N场比赛,每场比赛需要一定数量的题目数,现在有M个题目,每个题目只能提供给特定的几场比赛,并且一次只能在一场比赛中出现。

问最多可以举办多少场比赛。

思路:因为N = 15 , 所以直接二进制枚举举办的比赛的情况,然后对于每种情况建图,

S - >题目,流量1

题目 ->比赛,流量1

比赛->T,流量为该场比赛需要的题目数。

每次都跑最大流,看是否等于所需的题目数,然后更新答案即可。

#include <set>
#include <map>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <string>
#include <vector>
#include <iomanip>
#include <cstring>
#include <iostream>
#include <algorithm>
#define Max 2505
#define FI first
#define SE second
#define ll long long
#define PI acos(-1.0)
#define inf 0x3fffffff
#define LL(x) ( x << 1 )
#define bug puts("here")
#define PII pair<int,int>
#define RR(x) ( x << 1 | 1 )
#define mp(a,b) make_pair(a,b)
#define mem(a,b) memset(a,b,sizeof(a))
#define REP(i,s,t) for( int i = ( s ) ; i <= ( t ) ; ++ i ) using namespace std;
#define N 222
#define M 5555
struct kdq {
int e , next , l ;
} ed[M] ;
int head[N] , num ;
void init() {
mem(head ,-1) ;
num = 0 ;
}
void add(int s ,int e ,int l) {
ed[num].e = e ;
ed[num].next = head[s] ;
ed[num].l = l ;
head[s] = num ++ ;
ed[num].e = s ;
ed[num].next = head[e] ;
ed[num].l = 0 ;
head[e] = num ++ ;
}
map<string ,int>MM;
int n , m ;
int a[N] ;
string x ;
int fk[111][111] ;
char now[M] ; int S , T ;
int deep[111] ;
int qe[111111] ; int dinic_bfs() {
mem(deep , -1) ;
deep[S] = 0 ;
int h = 0 , t = 0 ;
qe[h ++ ] = S ;
while(h > t) {
int tp = qe[t ++ ] ;
for (int i = head[tp] ; ~i ; i = ed[i].next ) {
int e = ed[i].e ;
int l = ed[i].l ;
if(l > 0 && deep[e] == -1) {
deep[e] = deep[tp] + 1 ;
qe[h ++ ] = e ;
}
}
}
return deep[T] != -1 ;
} int dinic_dfs(int now , int f) {
if(now == T)return f ;
int flow = 0 ;
for (int i = head[now] ; ~i ; i = ed[i].next ) {
int e = ed[i].e ;
int l = ed[i].l ;
if(deep[e] == deep[now] + 1 && l > 0 && (f - flow) > 0) {
int mm = min(l , f - flow) ;
int nn = dinic_dfs(e , mm) ;
flow += nn ;
ed[i].l -= nn ;
ed[i ^ 1].l += nn ;
}
}
if(!flow)deep[now] = -2 ;
return flow ;
} int dinic() {
int flow = 0 ;
while(dinic_bfs()) {
flow += dinic_dfs(S , inf) ;
}
return flow ;
}
int main() {
int ca = 0 ;
while(scanf("%d%d",&n,&m) , (n + m)) {
S = 0 , T = n + m + 1 ;
init() ;
MM.clear() ;
mem(fk ,0) ;
for (int i = 1 ; i <= n ; i ++ ) {
cin >> x ;
MM[x] = i ;
scanf("%d",&a[i]) ;
}
string st ;
st.clear() ;
gets(now) ;
for (int i = 1 ; i <= m ; i ++ ) {
gets(now) ;
st.clear() ;
int l = strlen(now) ;
if(l == 0)continue ;
for (int j = 0 ; j < l ; j ++ ) {
if(now[j] == ' ') {
if(st.size() == 0)continue ;
fk[MM[st]][i] = 1 ;
st.clear() ;
continue ;
}
st += now[j] ;
}
if(st.size()) {
fk[MM[st]][i] = 1 ;
}
}
int ans = 0 ;
for (int i = 0 ; i < (1 << n) ; i ++ ) {
init() ;
int nk = 0 ;
int sum = 0 ;
for (int j = 1 ; j <= m ; j ++ )add(S , j , 1) ;
for (int j = 0 ; j < n ; j ++ ) {
if(i & (1 << j)) {
for (int k = 1 ; k <= m ; k ++ ) {
if(fk[j + 1][k]) {
add(k , j + 1 + m , 1) ;
}
}
nk ++ ;
sum += a[j + 1] ;
add(j + 1 + m , T , a[j + 1]) ;
}
}
int fff = dinic() ;
if(fff == sum)ans = max(ans , nk) ;
}
printf("Case #%d: %d\n",++ ca ,ans) ;
}
return 0 ;
}

UVALIVE 4819 最大流的更多相关文章

  1. POJ 1459 Power Network / HIT 1228 Power Network / UVAlive 2760 Power Network / ZOJ 1734 Power Network / FZU 1161 (网络流,最大流)

    POJ 1459 Power Network / HIT 1228 Power Network / UVAlive 2760 Power Network / ZOJ 1734 Power Networ ...

  2. uvalive 3231 Fair Share 公平分配问题 二分+最大流 右边最多流量的结点流量尽量少。

    /** 题目: uvalive 3231 Fair Share 公平分配问题 链接:https://vjudge.net/problem/UVALive-3231 题意:有m个任务,n个处理器,每个任 ...

  3. BZOJ 4819 Luogu P3705 [SDOI2017]新生舞会 (最大费用最大流、二分、分数规划)

    现在怎么做的题都这么水了.. 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=4819 (luogu) https://ww ...

  4. UVALive - 6266 Admiral 费用流

    UVALive - 6266 Admiral 题意:找两条完全不相交不重复的路使得权值和最小. 思路:比赛的时候时间都卡在D题了,没有仔细的想这题,其实还是很简单的,将每个点拆开,连一条容量为1,费用 ...

  5. UVALive 6887 Book Club 最大流解最大匹配

    题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show ...

  6. UVALive - 6571 It Can Be Arranged 最大流

    题目链接: http://acm.hust.edu.cn/vjudge/problem/48415 It Can Be Arranged Time Limit: 3000MS 问题描述 Every y ...

  7. Uvalive 4865 Data Recovery 最大流

    题意就是 给一个50 * 50的矩阵 然后给出每行每列元素的和 和一个初始矩阵 矩阵中有些是未知,有些是已知 然后我们求目标矩阵就是把能确定的元素的值求出来,实在不能确定的就置为-1 所有矩阵元素的值 ...

  8. UVALive 3645 Objective: Berlin(最大流 :时序模型)

    题意:已知n(n <= 150)个城市和m(m <= 5000)个航班,每个航班有出发地.到达地.乘坐人数.起飞时间和降落时间(时间用时和分表示),求从一个指定城市出发,去往另一个指定城市 ...

  9. 【Uvalive 2531】 The K-League (最大流-类似公平分配问题)

    [题意] 有n个队伍进行比赛,每场比赛,恰好有一支队伍取胜.一支队伍败.每个队伍需要打的比赛场数相同,给你每个队伍目前已经赢得场数和输得场数,再给你一个矩阵,第 i 行第 j 列 表示队伍 i 和队伍 ...

随机推荐

  1. PHP替换中文字符

    mb_regex_encoding('utf-8');$htmlNavSubmenu2 = str_replace('<li id="w-menu-food-334"> ...

  2. iOS图片的伪裁剪(改变图片的像素值)

    0x00 原理 利用一张图片事先画好的图片(以下称为蒙板),盖在要被裁剪的的图片上,然后遍历蒙板上的像素点,修改被裁剪图片对应位置的像素的色值即可得到一些我们想要的不规则图片了(比如人脸) 0x01 ...

  3. linux如何开机以命令行形式启动?

    在管理员权限下,修改/etc/inittab文件即可.把id:5:initdefault:改为id:3:initdefault:就可以了. 如下图所示: 图1: . 图2:

  4. ios开发之ios9UIWebView不显示网页问题

    错误描述: App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecu ...

  5. 给id赋值

    var div = document.getElementByTagName('div') div.id="mydiv";div.setAttribute("id&quo ...

  6. 练习2 B题 - 求绝对值

      Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u   Description 求实数 ...

  7. 【RabbitMQ】 Routing

    Routing 之前的章节里我们构建了一个简单的日志系统.我们可以广播所有的日志消息给所有的接收端. 本节我们将给它添加一个新特性 - 我们将允许只订阅一个消息的子集.例如,我们只将关键的错误消息定位 ...

  8. 转:USB主机控制器(Host Controller)--深入理解

    1. 主机控制器(Host Controller) • UHCI: Universal Host Controller Interface (通用主机控制接口, USB1.0/1.1)      • ...

  9. Delphi 的各种错误信息(中英文)

    ******************************* * 编 译 错 误 信 息 * ******************************* ';' not allowed befo ...

  10. RichEdit中插入带背景色文本的一种思路

    uses RichEdit; function TextToRtf( // 将文本处理为RTF格式 mText: WideString // 输入文本 ): WideString; // 返回处理后的 ...