题意:有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. webservice拦截器 查看消息包(soap)

    服务端: 1.获取EndpointImpl对象 2.调用EndpointImpl对象中的方法获取In拦截器 3.调用EndpointImpl对象中的方法获取out拦截器 4.添加自己的In拦截器与Ou ...

  2. PHP替换中文字符

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

  3. 《Python 二三事》——python学习必看(转载)

        面向初学者介绍Python相关的一些工具,以及可能遇到的常见问题. 原文出处 原文作者:八八年出生的男性,互联网上常用id是 jagttt .目前正从事 IT 行业的工作.业余爱好是动漫游加电 ...

  4. 修改原代码定制bootstrap

    1.下载对应的Bootstarap和node.js 注:less文件夹中包含了bootstrap中所有样式组件的less源代码: dist保存编译后的css和js等文件 2.命令行输入npm inst ...

  5. 利用set实现去重

    最近读了一些有关于ES6的文章,觉得真是一个超级大的进步,就是不知道兼容性怎么样,鉴于我还在初学,先写个小例子练手,顺便时刻提醒自己要坚持学下去.未来的趋势肯定是替代es5没跑了. var arr=[ ...

  6. 新一代的代码编辑神器Sublime Text 3(使用指南)

    首先附上官网下载链接:http://www.sublimetext.com/3 接下来是安装sublime最强大的插件功能:Package Control 一.简单的安装方法 使用Ctrl+`快捷键或 ...

  7. windows server 2008 asp连接数据库sql2000失败

    由于服务器现在的服务器已不能承受了,需要替换服务器并把window2003升级为window2008,把所有数据都平移过来.平移完后遇到ASP总是不能连接上sql2000,这让我非常郁闷,处理了好几个 ...

  8. python中xrange与range的异同

    转载自:http://ciniao.me/article.php?id=17 >>> range(5) [0, 1, 2, 3, 4] >>> range(1, 5 ...

  9. 大用处--PowerShell Management Library for Hyper-V.

    http://pshyperv.codeplex.com/releases 用脚本来收集及集成HYPER-V管理. 越来越似KVM,LIBVIRT啦.

  10. c++实现委托

    #include "stdafx.h" #include <iostream> #include <string> using namespace std; ...