首页 > 其他分享 >[lnsyoj2621/luoguP2756] 飞行员配对问题

[lnsyoj2621/luoguP2756] 飞行员配对问题

时间:2025-01-22 16:59:18浏览次数:1  
标签:return cur idx int flow ne lnsyoj2621 luoguP2756 配对

题意

给定一侧 \(n\) 个点,一侧 \(m - n\) 个点的二分图,求最大匹配数及一个合法匹配

sol

二分图最大匹配问题。
可以使用匈牙利算法或网络流解决,其中网络流通常更快。
首先建立超级源点 \(S\) 和超级汇点 \(T\),由于每个点只能与其他点匹配一次,原二分图中的每条边在网络流中容量应为 \(1\);又因为每个点只能被选择一次,所以向超级源点及汇点连边时,每条边的容量都为 \(1\)。跑最大流即可。
输出方案时,枚举原图的每条边,当该边被选取,即反向边容量非 \(0\) 时,即为一对匹配。

代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>

using namespace std;

const int N = 105, M = 20005, INF = 0x3f3f3f3f;

int h[N], e[M], f[M], ne[M], idx;
int d[N], cur[N];
int n, n1, n2;
int S, T;

void add(int a, int b, int c){
    e[idx] = b, f[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;
    e[idx] = a, f[idx] = 0, ne[idx] = h[b], h[b] = idx ++ ;
}

void build(){
    memset(h, -1, sizeof h);
    scanf("%d%d", &n, &n1);
    n2 = n - n1; n += 2;
    for (int i = 1; i <= n1; i ++ ) add(n - 1, i, 1);
    for (int i = 1; i <= n2; i ++ ) add(n1 + i, n, 1);
    int a, b;
    while (scanf("%d%d", &a, &b) != EOF) 
        add(a, b, 1);
    S = n - 1, T = n;
}

bool bfs(){
    memset(d, -1, sizeof d);
    queue<int> q;
    d[S] = 0, q.push(S), cur[S] = h[S];
    while (!q.empty()){
        int t = q.front(); q.pop();
        for (int i = h[t]; ~i; i = ne[i]) {
            int j = e[i];
            if (d[j] == -1 && f[i]) {
                d[j] = d[t] + 1;
                cur[j] = h[j];
                if (j == T) return true;
                q.push(j);
            }
        }
    }
    return false;
}

int find(int u, int limit){
    if (u == T) return limit;
    int flow = 0;
    for (int i = cur[u]; ~i && flow < limit; i = ne[i]){
        int j = e[i];
        cur[u] = i;
        if (d[j] == d[u] + 1 && f[i]){
            int t = find(j, min(limit - flow, f[i]));
            if (!t) d[j] = -1;
            f[i] -= t, f[i ^ 1] += t, flow += t;
        }
    }
    return flow;
}

int dinic(){
    int r = 0, flow;
    while (bfs()) while (flow = find(S, INF)) r += flow;
    return r;
}

int main(){
    build();
    printf("%d\n", dinic());
    for (int i = (n1 + n2) * 2 + 1; i <= idx; i += 2) if (f[i]) printf("%d %d\n", e[i], e[i ^ 1]);
}

标签:return,cur,idx,int,flow,ne,lnsyoj2621,luoguP2756,配对
From: https://www.cnblogs.com/XiaoJuRuoUP/p/-/luoguP2756

相关文章

  • 零知识证明二(椭圆曲线配对)
    原文在此:https://medium.com/@VitalikButerin/exploring-elliptic-curve-pairings-c73c1864e6271简介椭圆曲线配对是各种构造背后的关键密码原型之一,包括确定性阈值签名、zk-SNARKs和其他更简单形式的零知识证明。椭圆曲线对(或“双线性映射”)是对已有30年历史的椭圆曲线加密应......
  • 配对交易统计套利策略不惧市场波动
    作者:老余捞鱼原创不易,转载请标明出处及原作者。写在前面的话:今天我要和大家分享的是一种能在市场上涨和下跌中都获利的投资策略。股票多空策略(也称为配统套利)通过精心挑选股票并平衡多头和空头头寸,投资者可以有效地管理市场波动并追求更高的回报。接下来,我将详细解析......
  • G1原理—2.G1是如何提升分配对象效率
    大纲1.G1的对象分配原理是怎样的2.深入分析TLAB机制原理3.借助TLAB分配对象的实现原理是什么4.什么是快速分配+什么是慢速分配5.大对象分配的过程+与TLAB的关系6.救命的稻草—JVM的最终分配尝试 G1如何分配对象+TLAB机制+分区协调机制G1设计了一套TLAB机制+快速分配......
  • 蓝牙配对弹框默认允许关闭
     蓝牙配对的时候,会有个以下的弹框,客户需求是不需要人为去点击,默认允许配对 实际处理弹框配对的是BluetoothPairingController.java BluetoothPairingRequest.java这个文件主要负责处理配对弹框的广播申请,直接去掉那些流程,确认配对即可---a/src/com/android/settings......
  • 洛谷P2756 飞行员配对方案问题
    题目洛谷P2756飞行员配对方案问题题目大意一共有n个飞行员前m个外籍飞行员,后(n-m)个则为英国飞行员一个外籍飞行员与英国飞行员进行匹配,求最大配合数思路不难看出本题考察匈牙利算法本体真正意思是给定一个二分图其左部点的个数为m右部点的个数为(n-m)求其最大匹配的边......
  • 【数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】
    目录......
  • BLE中的配对原理分析三
    BLE中的配对原理分析三说明​ 前面的两篇博客已经把LTK的生成给了出来,但是也说到LTK并非是最后用于AES加密的实际密钥。今天我们就再进一步分析,通信时候的数据到底是如何被加密成密文,密文究竟是如何被解密成明文的。架构说明​ 首先要明确一点,这里的部分其实已经跟HOST层的安......
  • 力扣面试题 28 - 配对交换
    题目:配对交换。编写程序,交换某个整数的奇数位和偶数位,尽量使用较少的指令(也就是说,位0与位1交换,位2与位3交换,以此类推)。示例1:输入:num=2(或者0b10)输出1(或者0b01)示例2:输入:num=3输出:3提示:num的范围在[0,2^30-1]之间,不会发生整数溢出。思路:首先我们......
  • 无需配对数据的对比学习图像到图像转换,助力跨域物体检测 | BMVC'24
    来源:晓飞的算法工程笔记公众号,转载请注明出处论文:ImprovingObjectDetectionviaLocal-globalContrastiveLearning论文地址:https://arxiv.org/abs/2410.05058论文代码:https://local-global-detection.github.io/创新点提出了一种新颖的图像到图像转换方法,用于......
  • 聊聊蓝牙配对技术-CTKD OVER BR/EDR
    背景最近一直在调试耳机的BLEAUDIO功能,一次测试中把CTKD(Cross-transportkeyderivation)宏开关给关了,发现手机完全不会去连接耳机的LEAUDIO服务,甚至BLE连接都不会建立。说明手机连接双模蓝牙耳机的机制是:先去配对BR/EDR,然后通过CTKD的方式去建立BLE连接。带着好奇心去一......