题意:有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. 数组Api .map()的使用

    之前并没有过多的使用过这个Api,在此记录下对其的理解,方便以后多多使用. 首先是对map的说明: var mappedArray = array.map(callback[, thisObject] ...

  2. PHP-HTML重要知识点笔记

    1.用frameset.frame和iframe还实现多窗口 2.在图片上利用映射距离usemap来实现按钮跳转.------第8尾集 3.表单必须要有name和value,因为抓包的时候,可发现必须 ...

  3. PHP 开启 ssh2

    首先,为PHP安装SSH2扩展需要两个软件包, libssh2和ssh2(php pecl拓展). 两者的最新版本分别为libssh2-1.5.0.tar.gz和ssh2-0.12.tgz,下载地址分 ...

  4. linux自动备份文件和数据库并上传到指定的远程FTP中

    直接把以下脚本复制到/root/backup.sh[root@lvtao.net ~]# chmod +x /root/backup.sh[root@lvtao.net ~]# crontab -e0 ...

  5. X86架构与ARM架构比较

    引言 CPU是怎样运作的? CPU的运作与人脑的运作差不多.先谈一下人这个系统的工作方式.眼镜.耳朵.舌头.皮肤等等感觉器官接收到“触觉”,把信息传给大脑,大脑把信息处理后,把处理结果送给手.脚.嘴等 ...

  6. Python的subprocess模块

    尝试在Python中运行可执行文件,网上给出的解决方案是: import os os.system("此处填程序路径") 我要运行的程序文件名中有空格,因此果断失败了,查看了一下帮 ...

  7. 【译】UI设计基础(UI Design Basics)--启动与停止(Starting and Stopping)(五)

    2.4  启动与停止(Starting and Stopping) 2.4.1  立即启动(Start Instantly) 通常来讲,用户不会花超过两分钟的时候去评价一个新的应用.在这段有限的时间里 ...

  8. BZOJ 1049 数字序列

    Description 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希望改变的幅度太大. Input 第一行包含一个数 ...

  9. [Forward]Visual Guide: Setting up My Sites in SharePoint 2013

    from  http://blog.sharedove.com/adisjugo/index.php/2012/07/25/visual-guide-setting-up-my-sites-in-sh ...

  10. html 商品展示框

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