图论-匈牙利算法学习

news2024/7/6 18:57:38
  1. 本文讲述的是匈牙利算法,即图论中寻找最大匹配的算法。
  2. 解决的问题是从二分图中找到尽量多的匹配。

原题-华为-HJ28 素数伴侣

描述
题目描述
若两个正整数的和为素数,则这两个正整数称之为“素数伴侣”,如2和5、6和13,它们能应用于通信加密。现在密码学会请你设计一个程序,从已有的 N ( N 为偶数)个正整数中挑选出若干对组成“素数伴侣”,挑选方案多种多样,例如有4个正整数:2,5,6,13,如果将5和6分为一组中只能得到一组“素数伴侣”,而将2和5、6和13编组将得到两组“素数伴侣”,能组成“素数伴侣”最多的方案称为“最佳方案”,当然密码学会希望你寻找出“最佳方案”。

输入:

有一个正偶数 n ,表示待挑选的自然数的个数。后面给出 n 个具体的数字。

输出:

输出一个整数 K ,表示你求得的“最佳方案”组成“素数伴侣”的对数。

数据范围: 1≤n≤100 ,输入的数据大小满足 2≤val≤30000
输入描述:
输入说明
1 输入一个正偶数 n
2 输入 n 个整数

输出描述:
求得的“最佳方案”组成“素数伴侣”的对数。

示例1
输入:
4
2 5 6 13
输出:
2

示例2
输入:
2
3 6
输出:
0

解题

  1. 判断和是否是素数
  2. 进行最佳最多的匹配实现配对
  3. 两数必定是一偶一奇数
  4. 把输入的数字进行判断分成奇偶两组
  5. 若一组为空说明无法组成
  6. 之后通过匈牙利算法实现最多匹配
#include<iostream>
#include<vector>
using namespace std;

bool isprime(int num){ //判断一个数是否是素数
    for(int i = 2; i * i <= num; i++){ //遍历到根号num
        if(num % i == 0) //检查有无余数
            return false;
    }
    return true;
}

bool find(int num, vector<int>& evens, vector<bool>& used, vector<int>& match){
    for(int i = 0; i < evens.size(); i++){ //遍历每个偶数与奇数比较
        if(isprime(num + evens[i]) && !used[i]){
            used[i] = true;
            if(match[i] == 0 || find(match[i], evens, used, match)){ //如果第i个偶数还未配对,或者跟它配对的奇数还有别的选择
                match[i] = num; //则配对该数
                return true;
            }
        }
    }
    return false;
}
int main(){
    int n;
    while(cin >> n){
        vector<int> odds;
        vector<int> evens;
        vector<int> nums(n);
        for(int i = 0; i < n; i++){ //输入n个数
            cin >> nums[i];
            if(nums[i] % 2) //奇数
                odds.push_back(nums[i]);
            else //偶数
                evens.push_back(nums[i]);
        }
        int count = 0;
        if(odds.size() == 0 || evens.size() == 0){ //缺少奇数或者偶数无法构成素数
            cout << count << endl;
            continue;
        }
        vector<int> match(evens.size(), 0); //统计每个偶数的配对是哪个奇数
        for(int i = 0; i < odds.size(); i++){ //遍历每个奇数
            vector<bool> used(evens.size(), false); //每一轮偶数都没用过
            if(find(odds[i], evens, used, match)) //能否找到配对的偶数,且要最优
                count++;
        }
        cout << count << endl;
    }
    return 0;
}

匈牙利算法

二分图如下:
在这里插入图片描述
你是红娘,可以撮合任何一对有暧昧关系的男女,那么你最多能成全多少对情侣?(数学表述:在二分图中最多能找到多少条没有公共端点的边)

思路:如何成全一个男的和另外两个女的暧昧,

  • 情况1:其中一个女A有其他暧昧对象,另外一个女B没有暧昧对象,优先撮合男的和女B,反之亦然;如果A的另外一个暧昧对象C还有一个暧昧对象D,那么C和D成也行和A成也行都是最优。
  • 情况2:A有其他暧昧对象,B也有其他暧昧对象,考虑排在前的
  • 情况3:A和B没有有暧昧对象,考虑排在前的

简单来说就是,让只有一个暧昧对象的先成,再考虑渣男渣女
代码如下:

int M, N;            //M, N分别表示左、右侧集合的元素数量
int Map[MAXM][MAXN]; //邻接矩阵存图
int p[MAXN];         //记录当前右侧元素所对应的左侧元素
bool vis[MAXN];      //记录右侧元素是否已被访问过
bool match(int i)
{
    for (int j = 1; j <= N; ++j)
        if (Map[i][j] && !vis[j]) //有边且未访问
        {
            vis[j] = true;                 //记录状态为访问过
            if (p[j] == 0 || match(p[j])) //如果暂无匹配,或者原来匹配的左侧元素可以找到新的匹配
            {
                p[j] = i;    //当前左侧元素成为当前右侧元素的新匹配
                return true; //返回匹配成功
            }
        }
    return false; //循环结束,仍未找到匹配,返回匹配失败
}
int Hungarian()
{
    int cnt = 0;
    for (int i = 1; i <= M; ++i)
    {
        memset(vis, 0, sizeof(vis)); //重置vis数组
        if (match(i))
            cnt++;
    }
    return cnt;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/458472.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Vue】学习笔记-初始化脚手架

初始化脚手架 初始化脚手架说明具体步骤脚手架文件结构 初始化脚手架 说明 Vue脚手架是vue官方提供的标准化开发工具&#xff08;开发平台&#xff09;最新版本是4.x文档Vue CLI 具体步骤 如果下载缓慢请配置npm淘宝镜像 npm config set registry http://registry.npm.taoba…

有关态势感知(SA)的卷积思考

卷积是一种数学运算&#xff0c;其本质是将两个函数进行操作&#xff0c;其中一个函数是被称为卷积核或滤波器的小型矩阵&#xff0c;它在另一个函数上滑动并产生新的输出。在计算机视觉中&#xff0c;卷积通常用于图像处理和特征提取&#xff0c;它可以通过滤波器对输入图像进…

《Spring MVC》 第六章 MVC类型转换器、格式化器

前言 介绍MVC类型转换器、格式化器 1、使用场景 <form th:action"{/user/register}" method"post">用户名&#xff1a;<input type"text" name"userName"/><br/>密码&#xff1a;<input type"password&q…

对于Ubuntu服务器杀毒的一次记录

概述&#xff1a;叮咚&#xff01;您的主机有异常登录地&#xff0c;登录ip来自人类文明的标杆美丽国的加利福尼亚州&#xff0c;请注意排查。可恶的老美啊&#xff0c;又来入侵我华夏主机了&#xff0c;美帝亡我之心不死啊&#xff08;当然也有可能是境内中国人通过VPN操作境外…

【搭建博客】宝塔面板部署Typecho博客,并发布上线访问

目录 前言 1.安装环境 2.下载Typecho 3.创建站点 4.访问Typecho 5.安装cpolar 6.远程访问Typecho 7.固定远程访问地址 8.配置typecho 前言 Typecho是由type和echo两个词合成的&#xff0c;来自于开发团队的头脑风暴。Typecho基于PHP5开发&#xff0c;支持多种数据库&…

让chatgpt给我做个项目预算,感觉这样的项目预算才有的赚

访问入口来自于以下网站&#xff1a; 无极低码-三维可视化,免费资源下载,气象数据,编程技术,java开发,素材下载,大数据,解决方案,方案,ppt,5G,数字孪生三维可视化,免费资源下载,气象数据,编程技术,java开发,素材下载,大数据,解决方案,方案,ppt,5G,数字孪生https://wheart.cn/ …

分享几个国内免费的ChatGPT镜像网址(亲测有效-4月25日更新)

最近由于ChatGPT的爆火也让很多小伙伴想去感受一下ChatGPT的魅力&#xff0c;那么今天就分享几个ChatGPT国内的镜像网址&#xff0c;大家可以直接使用&#xff01;记得点赞收藏一下呦&#xff01; 1、AQ Bot&#xff0c;网址&#xff1a;点我 https://su.askaiw.com/aq 缺点&…

数据结构与算法(三):数论(树形结构、二叉树、二叉搜索树、红黑树、BtreeB+Tree、赫夫曼树、堆树)

数论&#xff08;树形结构、二叉树、二叉搜索树、红黑树、Btree、BTree、赫夫曼树、堆树&#xff09; 树形结构概念 在树形结构里面重要的术语&#xff1a; 结点&#xff1a;树里面的元素。 父子关系&#xff1a;结点之间相连的边 子树&#xff1a;当结点大于1时&#xff0…

服务(第十一篇)LVS-NAT模式

什么是群集&#xff1f; 多台主机组成的一个整体&#xff0c;提供一个ip访问通道&#xff0c;所有的主机干一件事 提供同样的服务。 群集有哪些类型&#xff1f; ①负载均衡群集&#xff08;LB&#xff09;&#xff1a; 提高系统的响应能力&#xff0c;处理更多的访问请求&a…

VideoPose3D:基于视频的3D人体关键点检测

1. 概述 Dario Pavllo等人于2019年提出了VideoPose3D模型&#xff0c;旨在把输入视频转换成人体各关键点相对于根关节的相对三维位置。为了实现这一目的&#xff0c;作者采取的是两步走的策略。首先要利用现成的2D姿态检测算法提取出视频各帧里人体各关键点的2D坐标&#xff0…

Bilibili 网页版下载视频 B站下载MP4格式视频(不用下载工具)

博主是为了给家里老人下载戏曲&#xff0c;一开始是单个单个解析然后下载&#xff0c;想多下载一些&#xff0c;然后用了批量方法下载很好用 通过网页版解析工具 解析单个视频 获得下载地址 复制视播放地址&#xff0c;如&#xff0c;复制播放视频时&#xff0c;上方的地址 然…

校园最热微信小程序——校园表白墙之我想对你说(青春感人系列)

校园最热微信小程序——校园表白墙之我想对你说&#xff08;青春感人系列&#xff09; 注&#xff1a;想要快速了解可以直接跳转到小程序视频展示&#xff08;手机用户可能打不开视频&#xff0c;电脑用户是可以打开视频的&#xff09;&#xff0c;手机用户可以打开我的主页里面…

系统运维(Kubernetes篇)

Kubernetes(k8s) 前言 ​ 在学习过程中&#xff0c;我们经常会遇到遗忘的问题。为了避免忘记&#xff0c;多复习是非常必要的。复习可以帮助我们巩固知识&#xff0c;加深记忆&#xff0c;提高学习效率。因此&#xff0c;我们应该养成良好的复习习惯&#xff0c;定期回顾所学…

猿创征文|“云“创新展望:数据之浩瀚

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; AWS–全球云计算领导者 AWS亚马逊云科技提供全球覆盖广泛、服务深入的云平台&#xff0c;全球数据中心提供超过 200 项功能齐全的服务 连续 11 年被 Gartner 评为&quo…

【JUC高并发编程】—— 了解JUC

一、集合的线程安全 ArrayList 线程不安全 通过代码演示 ArrayList 集合的线程不安全问题 package com.atguigu.lock;import java.util.ArrayList; import java.util.List; import java.util.UUID;/*** author Bonbons* version 1.0* 演示List集合线程不安全问题*/ public cl…

队列的定义、基本操作、案例

&#x1f4dd;个人主页&#xff1a;爱吃炫迈 &#x1f48c;系列专栏&#xff1a;数据结构与算法 &#x1f9d1;‍&#x1f4bb;座右铭&#xff1a;道阻且长&#xff0c;行则将至&#x1f497; 文章目录 队列队列的基本操作定义队列enqueue&#xff1a;向队列添加元素dequeue&am…

dockerfile镜像实战

dockerfile镜像实战 部署SSH镜像部署Systemctl镜像部署Nginx镜像部署tomcat 镜像部署mysql镜像在客户端连接mysql容器 部署SSH镜像 [rootdocker01 ~]# mkdir /opt/sshd [rootdocker01 ~]# cd /opt/sshd [rootdocker01 sshd]# vim Dockerfile#第一行必须指明基于的基础镜像 FRO…

【C语言】指针进阶[上] (字符、数组指针、指针数组、数组传参和指针传参)

简单不先于复杂&#xff0c;而是在复杂之后。 目录 1. 字符指针 面试题 2. 指针数组 3. 数组指针 3.1 数组指针的定义 3.2 &数组名 VS 数组名 3.3 数组指针的使用 4. 数组参数、指针参数 4.1 一维数组传参 4.2 二维数组传参 4.3 一级指针传参 4.4 二…

数据预处理(Data Preprocessing)

Data Preprocessing 前言Why preprocess?Major Tasks in Data PreprocessingData CleaningIncomplete (Missing) DataWhat to Consider When Handling Missing Data?MCARMARMNAR How to Handle Missing Data - ImputationMore on ImputationEven More on ImputationPreproces…