题目链接:【http://hihocoder.com/problemset/problem/1393】

题意:中文题意。

题解:二分图的多重匹配。主要是建图然后跑一个最带流,再判断一下就可以了。

建图:首先要保证每个学生最多选择a[i]节课,那么我们建立一个超级起点S,S->学生,流量为学生最多选的课数,然后每个学生向它喜欢的课程建立一条流量为1的边,然后又要保证每个项目的人数,每个项目向超级汇点T建立一条流量为M[i]的边,表示每节课最多上M[i]个人。然后跑最大流,判断指向终点的边是不是满载就可以了。

【http://blog.csdn.net/tramp_1/article/details/52663763】推荐博客。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = ;
const int maxm = ;
const int INF = 0x3f3f3f3f;
struct Edge
{
int to, next, cap, flow;
Edge(int to = , int next = , int cap = , int flow = ): to(to), next(next), cap(cap), flow(flow) {}
} edge[maxm];
int head[maxn], tot;
void init()
{
memset(head, -, sizeof(head));
tot = ;
}
void addedge(int u, int v, int w, int rw = )
{
edge[tot] = Edge(v, head[u], w, );
head[u] = tot++;
edge[tot] = Edge(u, head[v], rw, );
head[v] = tot++;
}
int gap[maxn], dep[maxn], pre[maxn], cur[maxn];
int sap(int st, int ed, int nodenum)
{
memset(gap, , sizeof(gap));
memset(dep, , sizeof(dep));
memcpy(cur, head, sizeof(head));
int u = st;
pre[u] = -;
gap[] = nodenum;
int ans = ;
while(dep[st] < nodenum)
{
if(u == ed)
{
int Min = INF;
for(int i = pre[u]; i != -; i = pre[edge[i ^ ].to])
if(Min > edge[i].cap - edge[i].flow)
Min = edge[i].cap - edge[i].flow;
for(int i = pre[u]; i != -; i = pre[edge[i ^ ].to])
{
edge[i].flow += Min;
edge[i ^ ].flow -= Min;
}
u = st;
ans += Min;
continue;
}
bool fg = false;
int v;
for(int i = cur[u]; i != -; i = edge[i].next)
{
v = edge[i].to;
if(edge[i].cap - edge[i].flow && dep[v] + == dep[u])
{
fg = true;
cur[u] = pre[v] = i;
break;
}
}
if(fg)
{
u = v;
continue;
}
int Min = nodenum;
for(int i = head[u]; i != -; i = edge[i].next)
if(edge[i].cap - edge[i].flow && dep[edge[i].to] < Min)
{
Min = dep[edge[i].to];
cur[u] = i;
}
gap[dep[u]]--;
if(!gap[dep[u]]) return ans;
dep[u] = Min + ;
gap[dep[u]]++;
if(u != st) u = edge[pre[u] ^ ].to;
}
return ans;
}
int T, n, m;
int main ()
{
scanf("%d", &T);
while(T--)
{
init();
scanf("%d%d", &n, &m);
int num = ;
for(int i = ; i <= m; i++)
{
int t;
scanf("%d", &t);
num += t;
addedge(n + i, n + m + , t);
}
for(int i = ; i <= n; i++)
{
int x, t;
scanf("%d%d", &t, &x);
addedge(, i, t);
for(int j = ; j <= x; j++)
{
scanf("%d", &t);
addedge(i, n + t, );
}
}
int flow = sap(, n + m + , n + m + );
if(flow == num)
printf("Yes\n");
else
printf("No\n");
}
return ;
}

hiho1393二分图多重匹配的更多相关文章

  1. hihoCoder 1393 网络流三·二分图多重匹配(Dinic求二分图最大多重匹配)

    #1393 : 网络流三·二分图多重匹配 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 学校的秋季运动会即将开始,为了决定参赛人员,各个班又开始忙碌起来. 小Hi和小H ...

  2. 【POJ 1698】Alice's Chance(二分图多重匹配)

    http://poj.org/problem?id=1698 电影和日子匹配,电影可以匹配多个日子. 最多有maxw*7个日子. 二分图多重匹配完,检查一下是否每个电影都匹配了要求的日子那么多. #i ...

  3. 稳定的奶牛分配 && 二分图多重匹配+二分答案

    题意: 农夫约翰有N(1<=N<=1000)只奶牛,每只奶牛住在B(1<=B<=20)个奶牛棚中的一个.当然,奶牛棚的容量有限.有些奶牛对它现在住的奶牛棚很满意,有些就不太满意 ...

  4. hiho 第117周 二分图多重匹配,网络流解决

    描述 学校的秋季运动会即将开始,为了决定参赛人员,各个班又开始忙碌起来. 小Hi和小Ho作为班上的班干部,统计分配比赛选手的重任也自然交到了他们手上. 已知小Hi和小Ho所在的班级一共有N名学生(包含 ...

  5. 【网络流24题】No.7 试题库问题 (最大流,二分图多重匹配)

    [题意] 假设一个试题库中有 n 道试题. 每道试题都标明了所属类别. 同一道题可能有多个类别属性.现要从题库中抽取 m 道题组成试卷.并要求试卷包含指定类型的试题. 试设计一个满足要求的组卷算法. ...

  6. POJ2584 T-Shirt Gumbo【二分图多重匹配】

    题目链接: id=2584">http://poj.org/problem?id=2584 题目大意: 如今有5种型号(S.M.L.X.T)的衣服要发放给N个參赛队员.给出每一个參赛者 ...

  7. 网络流24题 第五题 - PowerOJ1740 CodeVS1905 圆桌问题 二分图多重匹配 网络最大流

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - PowerOJ1740 - 有SPJ - 推荐 题目传送门 - CodeVS1905 - 无SPJ - 0% ...

  8. [HihoCoder1393]网络流三·二分图多重匹配

    题目大意: 班级有$N$名学生,运动会有$M$项不同的比赛,第$i$项比赛每个班需要派出$m_i$名选手参加,编号为i的学生最多同时参加给定的$b_i$项比赛中的任意$a_i$项比赛.根据统计的结果, ...

  9. hdu3605 Escape 二分图多重匹配/最大流

    2012 If this is the end of the world how to do? I do not know how. But now scientists have found tha ...

随机推荐

  1. .net core 中 identity server 4 之Topic --定义Client

    客户端指能够从id4获取Token的角色. 客户端的共性: a unique client ID a secret if needed the allowed interactions with th ...

  2. 【转】 虚拟机Linux不能上网简单有效的解决办法(NAT模式下)

    前提条件: a. 确保VMware Network Adapter for VMnet8 处于启用状态,这个是NAT网络模式要用的虚拟网卡.注意这个网卡的IP地址,不需要做手动设置 b. 确保 VMw ...

  3. Stat3—因子分析(Factor Analysis)

    题注:主成分分析分析与因子分析也有不同,主成分分析仅仅是变量变换,而因子分析需要构造因子模型.主成分分析:原始变量的线性组合表示新的综合变量,即主成分:因子分析:潜在的假想变量和随机影响变量的线性组合 ...

  4. 聊聊spring的那些扩展机制

    1.背景 慎入:本文将会有大量代码出入. 在看一些框架源码的时候,可以看见他们很多都会和Spring去做结合.举个例子dubbo的配置: 很多人其实配置了也就配置了,没有去过多的思考:为什么这么配置s ...

  5. [转载]Android中Bitmap和Drawable

    一.相关概念 1.Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable) ...

  6. 将neuroph导入到Eclipse中

    1.下载neuroph 网址:http://neuroph.sourceforge.net/ 本人选择的是2.8版本 2.解压文件 本人解压至:D:\neuroph-2.8 3.neuroph jar ...

  7. Centos查看端口占用和关闭端口

    Centos查看端口占用情况命令,比如查看80端口占用情况使用如下命令:   lsof -i tcp:80   列出所有端口   netstat -ntlp   1.开启端口(以80端口为例)     ...

  8. shell脚本自带变量的含义

    $0 Shell本身的文件名 $1-$n 添加到Shell的各参数值.$1是第1参数.$2是第2参数… $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process ...

  9. [转载]Firefox插件(plugins)开发实用指南

    转自: http://huandu.me/2010/02/11/595/ Firefox插件可实现强大功能,但其中麻烦事情不少.写这个实用指南首先是为了方便自己记忆,免得以后再次栽倒一些坑里面,如果能 ...

  10. maven将jar包打如本地仓库命令

    mvn install:install-file -DgroupId=org.apache.maven.plugins -DartifactId=maven-javadoc-plugin -Dvers ...