hihocoder-1393 二分图的多重匹配(网络流做法)

【C++】C++异常语法、使用、规范、异常安全及异常的优缺点 实际中我们可以可以去继承exception类实现自己的异常类。但是实际中很多公司像上面一样自己定义一套异常继承体系。因为C++标准库设计的不够好用。如果有一个块抛出一个异常,捕获异常的方法会使用 try 和 catch 关键字。try 块中放置可能抛出异常的代码,try 块中的代码被称为保护代码。C++ 提供了一系列标准的异常,定义在 中,我们可以在程序中使用这些标准的异常。异常是一种处理错误的方式, 阅读详情

题意:

n个人m种比赛项目,每个人有若干个自己擅长的项目,但每个人最多只想参加若干个比赛项目(每个人不会参加其不擅长的比赛项目),而每个比赛项目又必须需要若干个比赛人员,给定若干信息,问能否安排一个方案满足上述所有要求。

分析:

裸的二分图的多重匹配,源点S连向A部每个人,容量为每个人最多想参加的项目数目,B部每种项目连向汇点T,容量为每个项目必须需要的人员数目,A部和B部之间就是每个人与其对应擅长的比赛项目进行连边,容量为1。跑一次最大流之后,判断B部所有点到汇点的所有边是否都是满流,如果是则能满足要求,否则不能。

代码:

#include <algorithm>    
#include <iostream>    
#include <string.h>    
#include <cstdio>    
#include <queue>    
using namespace std;    
const int inf = 0x3f3f3f3f;    
const int maxn = 210;    
const int maxm = 21010;  
struct node{int w; int v, next;} edge[maxm];    
int pre[maxn], rec[maxn], head[maxn], gap[maxn], now[maxn];    
int dis[maxn];  
int t, n, m, no, up, sum;    
int S, T;   
queue<int> q;  
inline void add(int u, int v, int w)    
{    
    edge[no].v = v; edge[no].w = w;    
    edge[no].next = head[u]; head[u] = no++;    
    edge[no].v = u; edge[no].w = 0;    
    edge[no].next = head[v]; head[v] = no++;    
}    
inline void pre_init()    
{    
    no = 0;  
    memset(head, -1, sizeof head);    
}    
void init(int S, int T)    
{    
    memset(gap, 0, sizeof gap);    
    memset(dis, 0x3f, sizeof dis);    
    for(int i = 0; i <= up; ++i)     
    now[i] = head[i];  
    while(!q.empty()) q.pop();    
    dis[T] = 0; q.push(T);    
    while(!q.empty())   
    {    
        int tp = q.front(); q.pop();    
        ++gap[dis[tp]];    
        int k = head[tp];    
        while(k != -1)    
        {    
            if(dis[edge[k].v] == inf && edge[k^1].w)    
            {    
                dis[edge[k].v] = dis[tp]+1;    
                q.push(edge[k].v);    
            }    
            k = edge[k].next;    
        }    
    }    
}    
int SAP(int S, int T)    
{  
    int ans = 0, flow = inf;  
    int top = S;    
    pre[S] = S; init(S, T);    
    while(dis[S] < up)  
    {  
        if(top == T)    
        {    
            ans += flow;    
            while(top != S)  
            {    
                edge[rec[top]].w -= flow;    
                edge[rec[top]^1].w += flow;    
                top = pre[top];    
            }    
            flow = inf;    
        }    
        int k = now[top];    
        while(k != -1)    
        {    
            int v = edge[k].v;    
            if(edge[k].w && dis[top] == dis[v]+1)    
            {    
                flow = min(flow, edge[k].w);    
                pre[v] = top; rec[v] = k;    
                now[top] = k; top = v;    
                break;    
            }    
            k = edge[k].next;    
        }    
        if(k == -1)    
        {    
            int mind = up;    
            if(--gap[dis[top]] == 0) break;  
            int k = now[top] = head[top];  
            while(k != -1)    
            {    
                if(edge[k].w && mind>dis[edge[k].v]) mind = dis[edge[k].v];    
                k = edge[k].next;    
            }    
            ++gap[dis[top] = mind+1];    
            top = pre[top];    
        }    
    }    
    return ans;    
}    
void mapping()  
{  
    int x, a, b; 
	sum = 0; 
	for(int i = 1; i <= m; ++i)
	{
		scanf("%d", &x);
		sum += x;
		add(n+i, T, x);
	}
    for(int i = 1; i <= n; ++i)    
    {    
    	scanf("%d", &a);
    	add(S, i, a);
    	scanf("%d", &b);
        for(int j = 1; j <= b; ++j)  
        {
        	scanf("%d", &x);
        	add(i, n+x, 1);
		}
    }  
}  
int main()    
{
    for(scanf("%d", &t); t--;)    
    {    
    	scanf("%d %d", &n, &m);
        up = n+m+2, S = n+m+1, T = n+m+2;  
        pre_init();    
        mapping();
        if(SAP(S, T) == sum) puts("Yes");
        else puts("No"); 
    }    
    return 0;    
}


很显然,求解二分图的多重最优匹配就是用费用流去做,建立源点S到A部所有点的边容量为当前点的限制,费用为0,再建立B部所有点到汇点T的边容量也是当前点的限制,费用为0,中间A、B两部的建边就是二分图之间的边,之后跑一边费用流即可。


继续加油~

SOEM主站开发篇(1):移植SOEM主站到Linux开发板 详细介绍了SOEM主站源码移植到Linux开发板上的步骤,同时演示了如何使用Linux开发板获取EtherCAT从站的PDO映射信息。 阅读详情

相关推荐

ESP32锂电池电量检测实战:从引脚选择到低功耗优化(附完整电路图)

本文详细介绍了ESP32锂电池电量检测的实战方案,从ADC引脚选择到低功耗优化,提供完整的电路图和代码实现。通过MOS管智能开关和深度睡眠技术,显著降低静态功耗至0.5μA,提升设备续航能力。适合物联网开发者解决电量检测中的常见问题。

weixin_28731223的博客 462

二分图的多重最大匹配——网络流

hihoCoder1393秋季运动会 HDU3605 Escape

Wildcatastrophe的博客 1638

我的AI学习 ai维护工具之langfuse

as_type: Optional[Literal[‘generation’]] = None, # 将记录定义为 Observation (LLM 调用)transform_to_string: Optional[Callable[[Iterable], str]] = None # 将输出转为 string。要用LangFuse的云服务,首先要在LangFuse官网上注册,注册完后将页面拉倒最后,点免费的SignUp,API文档:https://api.reference.langfuse.com/

liubaobin的博客 4095

网络流三·二分图多重匹配

描述 学校的秋季运动会即将开始,为了决定参赛人员,需要统计分配比赛选手。 已知班级一共有N名学生,编号依次为1..N。 运动会一共有M项不同的比赛,编号为1..M。第i项比赛每个班需要派出m[i]名选手参加。 根据统计,编号为i的学生表示最多同时参加a[i]项比赛,并且给出他所擅长的b[i]项比赛的编号。 希望将每个学生都安排到他所擅长的比赛项目,以增加夺冠的可能性。同时又要考虑满足每项

Renaissancer的专栏 3977

参考线平滑-FemPosDeviation-SQP

使用SQP(顺序二次规划)对离散点进行平滑

mpt0816的博客 2439

C#计算八字

private string[] jq = { "小寒", "大寒", "立春", "雨水", "惊蛰", "春分", "清明", "谷雨", "立夏", "小满", "芒种", "夏至", "小暑", "大暑", "立秋", "处暑", "白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪", "冬至" };private string[] dz = { "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥", "子" };

m0_72939038的博客 828

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

描述 学校的秋季运动会即将开始,为了决定参赛人员,各个班又开始忙碌起来。 小Hi和小Ho作为班上的班干部,统计分配比赛选手的重任也自然交到了他们手上。 已知小Hi和小Ho所在的班级一共有N名学生(包含小Hi和小Ho),编号依次为1..N。 运动会一共有M项不同的比赛,编号为1..M。第i项比赛每个班需要派出m[i]名选手参加。 根据小Hi和小Ho的统计,编号为i的学生表示最多同时参加a[...

weixin_33878457的博客 312

【WRFDA第三期】OBSPROC namelist 变量总结

OBSPROC namelist 变量总结

WW、forever的博客 1120

POJ 2112 Optimal Milking 二分图多重匹配 网络流+Floyd+二分

超级经典的一道题目。。竟然1A 了,

ChasingWaves 589

【RT-DETR涨点改进】全网独家首发、特征融合改进篇 | AAAI 2026 | 引入CDEM交叉动态增强模块,双向引导和融合,在低光图像增强中有效提升了图像的亮度,提升小目标和暗目标的检测准确率

本文提出了一种基于CDEM(交叉动态增强模块)改进的rtdetr网络模型,有效提升了在低光和复杂环境下的目标检测性能。CDEM模块通过动态增强亮度与色彩特征,改善图像输入质量,增强细节和对比度。该模块具有轻量级结构,易于集成到现有模型中,能够显著提升小目标和暗目标的检测准确率与鲁棒性。文章详细介绍了CDEM模块的结构原理、实现方法,并提供了完整的代码实现和配置指南,包括三种改进版本的YAML配置文件。实验结果表明,该方法在图像增强和目标检测任务中均取得了优异性能。

Ai缝合怪、助力小伙伴高效发论文 145

提升YOLOv8检测精度的边界框损失函数Focaler-IoU与InnerFocalerIoU的应用与效果

YOLOv8是一种常用的实时目标检测模型,基于CNN(卷积神经网络)结构并结合了一些改进技术以提高检测精度和速度。YOLOv8的核心在于边界框的预测和分类,而准确的边界框预测是提高模型整体性能的关键因素之一。在传统的IoU损失基础上,Focaler-IoU和InnerFocalerIoU进一步聚焦于边界框的边缘区域,通过调整损失权重,更好地关注难以检测的边界框,提高模型的鲁棒性和准确性。# 计算IoU# 计算Focaler-IoU损失在这里,我们定义了。

博客 1340

最大流圆桌问题(二分图多重匹配问题)

考虑建图,设置源点S为0,汇点T为n+m+1,源点向所有单位连其容量的边,每个单位向圆桌连1的边,每个圆桌向源点连圆桌的容量的边,可知符合网络流的容量限制和流量限制,其最大流就是合法方案之一。...

qq_52093121的博客 212

AutoSAR系列讲解(入门篇)2.1-AppL概述

该章主要是讲解SWC是如何在ECU中分布的

雪云飞星的博客 4万+

hihoCoder 1393: 网络流三·二分图多重匹配

http://hihocoder.com/problemset/problem/1393 描述 学校的秋季运动会即将开始,为了决定参赛人员,各个班又开始忙碌起来。 小Hi和小Ho作为班上的班干部,统计分配比赛选手的重任也自然交到了他们手上。 已知小Hi和小Ho所在的班级一共有N名学生(包含小Hi和小Ho),编号依次为1..N。 运动会一共有M项不同的比赛,编号为1..M。第i项比赛每个班...

266

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

hihocoder1393 网络流之二分图多重匹配

题目链接:http://hihocoder.com/problemset/problem/1393# 题目大意: 学校的秋季运动会即将开始,为了决定参赛人员,各个班又开始忙碌起来。 小Hi和小Ho作为班上的班干部,统计分配比赛选手的重任也自然交到了他们手上。 已知小Hi和小Ho所在的班级一共有N名学生(包含小Hi和小Ho),编号依次为1..N。 运动会一共有M

风一样的自由,色彩斑斓的雨季 1099

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

hihocoder1393 网络流三·二分图多重匹配

网络流三·二分图多重匹配 就是个模板 #include<iostream> #include<cstdio> #include<queue> #include<algorithm> using namespace std; struct node { int point; int nxt; int value; }; nod...

weixin_33897722的博客 133

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

网络流三·二分图多重匹配 HihoCoder - 1393

网络流三·二分图多重匹配 HihoCoder - 1393 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxv = 210; 4 const int maxe = 10210; 5 const int inf = 0x3f3f3f3f; 6 stru...

weixin_30819163的博客 134

【hihoCoder】#1393 : 网络流三·二分图多重匹配(网络流建图)

描述 学校的秋季运动会即将开始,为了决定参赛人员,各个班又开始忙碌起来。 小Hi和小Ho作为班上的班干部,统计分配比赛选手的重任也自然交到了他们手上。 已知小Hi和小Ho所在的班级一共有N名学生(包含小Hi和小Ho),编号依次为1..N。 运动会一共有M项不同的比赛,编号为1..M。第i项比赛每个班需要派出m[i]名选手参加。 根据小Hi和小Ho的统计,编号为i的学生表示最多同时参加a[...

红点雷龙XL 272

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

题目大意: 班级有$N$名学生,运动会有$M$项不同的比赛,第$i$项比赛每个班需要派出$m_i$名选手参加,编号为i的学生最多同时参加给定的$b_i$项比赛中的任意$a_i$项比赛。根据统计的结果,想知道能否有一个合适的安排,同时满足这些条件。 思路: 最大流求二分图多重匹配。建立超级源点$S$、超级汇点$T$。对于每一个学生$s_i$,连一条从$S$到$s_i$的容量为$a_i$的边。对...

weixin_33939843的博客 124

hihoCoder 1393 网络流三·二分图多重匹配 (网络流学习#3 记录)

题目链接:http://hihocoder.com/problemset/problem/1393   话说我之前一直不知道二分匹配可以用网络流做。。。 #include #include #include using namespace std; const int N=205; struct ss{ int v,c,nxt; } e[N*20]; int head

Fistice的博客 414

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

#1393 : 网络流三·二分图多重匹配 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 学校的秋季运动会即将开始,为了决定参赛人员,各个班又开始忙碌起来。 小Hi和小Ho作为班上的班干部,统计分配比赛选手的重任也自然交到了他们手上。 已知小Hi和小Ho所在的班级一共有N名学生(包含小Hi和小Ho),编号依次为1..N。 ...

weixin_30367873的博客 132

hihocoder 1393 : 网络流三·二分图多重匹配

标签: hihocoder 网络流 二分图 描述 学校的秋季运动会即将开始,为了决定参赛人员,各个班又开始忙碌起来。 小Hi和小Ho作为班上的班干部,统计分配比赛选手的重任也自然交到了他们手上。 已知小Hi和小Ho所在的班级一共有N名学生(包含小Hi和小Ho),编号依次为1..N。 运动会一共有M项不同的比赛,编号为1..M。第i项比赛每个班需要派出m[i]名选手参加。 根据小Hi和小Ho的统...

weixin_30399155的博客 93

hihoCoder 1393 网络流三·二分图多重匹配 (网络流学习#3 记录)

题目链接:http://hihocoder.com/problemset/problem/1393 话说我之前一直不知道二分匹配可以用网络流做。。。 #include<cstdio> #include<cstring> #include<queue> using namespace std; const int N=205; stru...

weixin_30367169的博客 113

HihoCoder 1393 二分图多重匹配 Dinic

#include<stdio.h> #include<string> #include<cstring> #include<queue> #include<algorithm> #include<functional> #include<vector> #include<iomanip> #include<math.h> #include<iostream> #include<sstream> #i

Katapeltes 504
上一篇: HDU-4424 Conquer a New Region(并查集)
下一篇: DLX模板之精确覆盖和重复覆盖
薄层
博客等级 码龄10年 242粉丝 289原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值