hiho1393二分图多重匹配-程序员宅基地

题目链接:【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 = 1050;
const int maxm = 10050;
const int INF = 0x3f3f3f3f;
struct Edge
{
    int to, next, cap, flow;
    Edge(int to = 0, int next = 0, int cap = 0, int flow = 0): to(to), next(next), cap(cap), flow(flow) {}
} edge[maxm];
int head[maxn], tot;
void init()
{
    memset(head, -1, sizeof(head));
    tot = 0;
}
void addedge(int u, int v, int w, int rw = 0)
{
    edge[tot] = Edge(v, head[u], w, 0);
    head[u] = tot++;
    edge[tot] = Edge(u, head[v], rw, 0);
    head[v] = tot++;
}
int gap[maxn], dep[maxn], pre[maxn], cur[maxn];
int sap(int st, int ed, int nodenum)
{
    memset(gap, 0, sizeof(gap));
    memset(dep, 0, sizeof(dep));
    memcpy(cur, head, sizeof(head));
    int u = st;
    pre[u] = -1;
    gap[0] = nodenum;
    int ans = 0;
    while(dep[st] < nodenum)
    {
        if(u == ed)
        {
            int Min = INF;
            for(int i = pre[u]; i != -1; i = pre[edge[i ^ 1].to])
                if(Min > edge[i].cap - edge[i].flow)
                    Min = edge[i].cap - edge[i].flow;
            for(int i = pre[u]; i != -1; i = pre[edge[i ^ 1].to])
            {
                edge[i].flow += Min;
                edge[i ^ 1].flow -= Min;
            }
            u = st;
            ans += Min;
            continue;
        }
        bool fg = false;
        int v;
        for(int i = cur[u]; i != -1; i = edge[i].next)
        {
            v = edge[i].to;
            if(edge[i].cap - edge[i].flow && dep[v] + 1 == dep[u])
            {
                fg = true;
                cur[u] = pre[v] = i;
                break;
            }
        }
        if(fg)
        {
            u = v;
            continue;
        }
        int Min = nodenum;
        for(int i = head[u]; i != -1; 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 + 1;
        gap[dep[u]]++;
        if(u != st) u = edge[pre[u] ^ 1].to;
    }
    return ans;
}
int T, n, m;
int main ()
{
    scanf("%d", &T);
    while(T--)
    {
        init();
        scanf("%d%d", &n, &m);
        int num = 0;
        for(int i = 1; i <= m; i++)
        {
            int t;
            scanf("%d", &t);
            num += t;
            addedge(n + i, n + m + 1, t);
        }
        for(int i = 1; i <= n; i++)
        {
            int x, t;
            scanf("%d%d", &t, &x);
            addedge(0, i, t);
            for(int j = 1; j <= x; j++)
            {
                scanf("%d", &t);
                addedge(i, n + t, 1);
            }
        }
        int flow = sap(0, n + m + 1, n + m + 2);
        if(flow == num)
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/pealicx/p/6640723.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30508241/article/details/99122600

智能推荐

团队作业8----第二次项目冲刺(Beta阶段) 第三天-程序员宅基地

文章浏览阅读91次。冲刺第三天一、Daily Scrum Meeting照片二、每个人的工作1.昨天已完成的任务。昨天完成服务器上的数据库部署与Json数据传输2.今天计划完成的任务。今天计划完成安卓手机登入功能3.工作中遇到的困难。Json传输格式与数据库链接,进行了查询和学习。4.每个人的贡献比。余洋(201421123031):15%..._黄子敬 php

[ScreenOS] How to manually generate a new system self-signed certificate to replace the expired syst...-程序员宅基地

文章浏览阅读93次。SUMMARY:This article provides information on how to manually generate a new system self-signed certificate to replace the expired system self-signed certificate, without resetting the firewall...._the security key has expired, please generate a new key.是什么意思怎么解决

Python 利用matplotlib绘制热力图 correlation heatmap X,Y 坐标轴字体重叠显示问题,将字体进行旋转_热力图 x轴y轴字体显示-程序员宅基地

文章浏览阅读2.6w次,点赞18次,收藏51次。# 小白学习之路1.问题描述: 在学习kaggle经典学习项目Titanic,进行数据可视化处理时,对于每个特征进行相关性分析(也就是绘制pearson correlation heatmap )热力相关性矩阵时, plt.show() 图形绘制出来,字体会重叠.导致无法观察# Visualisations"""将数据进行可视化"""print(train.h..._热力图 x轴y轴字体显示

无迹卡尔曼滤波详细介绍及仿真-程序员宅基地

文章浏览阅读929次。无迹卡尔曼滤波UKF算法及源码_无迹卡尔曼滤波

DVWA——Brute force(low)_dvwa brute force一直都是impossible-程序员宅基地

文章浏览阅读527次。Brute force——暴力破解界面:源代码:<?phpif(isset($_GET['Login'])){//Getusername$user=$_GET['username'];//Getpassword$pass=$_GET['password'];$pass=md5($pass);//Checkthedatabase$query="SELECT*FROM`users`WHEREuser='$user'ANDpassword='$pass';";$result=_dvwa brute force一直都是impossible

Java使用Jaudiotagger读取Mp3及Flac音频操作-程序员宅基地

文章浏览阅读2.5k次。Jaudiotagger是jid3lib的扩展,比jlid3lib强大更多,支持更多格式。MP3信息的读取: try { MP3File file = new MP3File("mmt/sdcard2/Music/大艺术家.mp3"); String songName=file.getID3v2Tag().frameMap.get("TIT2").toString(..._org.jaudiotagger

随便推点

Linux的环境中如何生成srw-rw---- 的文件权限?-程序员宅基地

文章浏览阅读1.8k次。文件属性d 开头是: 目录文件。l 开头是: 符号链接(指向另一个文件,类似于瘟下的快捷方式)。s 开头是: 套接字文件(sock)。b 开头是: 块设备文件,二进制文件。c 开头是: 字符设备文件。p 开头是: 命名管道文件。创建套接字文件nc -Ul sock文件权限r = 4w = 2x = 1chmod 660 sock转载于:https://www.cnb..._linux srw

映美精相机软触发_c# 映美精相机-程序员宅基地

文章浏览阅读3.2k次。映美精 DFK 41BG02.H分辨率 1280X960最大帧率15采用C#编程,使用软件触发模式。触发1次,到ImageAvalible事件发生,记录其时间为96毫秒附近波动。手动计算时间如下: 像素个数:1280 * 960= 1,228,800RGB格式,1个像素3个Byte来表示,其字节数: 1,228,800 * 3 = 3686400相机处理后,读出时间1000 /_c# 映美精相机

蓝桥杯Python B组练习——斐波那契数列_python中b组蓝桥杯斐波那契与7代码及思路-程序员宅基地

文章浏览阅读539次,点赞9次,收藏7次。定义斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=1,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)定义来源于百度百科:斐波那契数列求100以内的斐波那契数列。_python中b组蓝桥杯斐波那契与7代码及思路

对PECompact加壳的DLL脱壳的一点分析_pecompact dll脱壳-程序员宅基地

文章浏览阅读2k次。目前,我对DLL的脱壳的了解也不多,相信有些地方会和对EXE的脱壳大致相同。现在我知道的主要不同是必须要在DLL的空间开始跟踪。否则从EXE开始跟踪,那还不把人累死。另外 ProcDump 和 PEditor 之类的工具好象还无法自动修复DLL的import table。唉,又是手动,什么时候有个DLL的脱壳机出现呢? ou,别看我!我编程的水平三流,写不出那些好东东。 样例文件: dlcsp_pecompact dll脱壳

算法实习准备之五:算法岗面试整理_算法岗实习准备-程序员宅基地

文章浏览阅读496次。算法实习准备之五算法岗面试整理CVFaster-RCNNCNN卷积池化全连接层反向传播LSTMAttentionTranformer机器学习算法线性回归LRSVM优化方法梯度下降法正则化NLPword2vecBert算法岗面试整理CVFaster-RCNNCNN卷积解释卷积层的最佳方法是想象有一束手电筒光正从图像的左上角照过。假设手电筒光可以覆盖 5 x 5 的区域,想象一下手电筒光照过输入图像的所有区域。在机器学习术语中,这束手电筒被叫做过滤器(filter,有时候也被称为神经元(neuron_算法岗实习准备

C#背单词小程序-程序员宅基地

文章浏览阅读2.7k次,点赞6次,收藏46次。这一讲是关于文件及流的操作。我们来做一个综合但不太复杂的程序"背单词"。要求如下:(4分)能将英语四级单词文本文件的内容读出来及放到内存的数组或列表中(使用StreamReader的循环读ReadLine()或直接ReadToEnd(), 然后用string的Split(’\n’)分割成多行;然后对每一行Trim().Split(’\t’)得到的string[]的第0个即为英语单词,第1个即为...