跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

华为机试:素数伴侣的二分图匹配解法

这道题的核心是把“素数伴侣”转成二分图最大匹配:因为两个数之和若为素数,通常只能是一奇一偶配对,所以把奇数和偶数分到两侧,和为素数就连边,再用 DFS 找增广路求最大匹配。代码里先预处理素数表,再按奇偶方向建图,最后对每个点做一次匹配尝试。注意多组输入时要清空邻接表和匹配状态。

Kubernet发布于 2026/6/30更新于 2026/8/2316 浏览
华为机试:素数伴侣的二分图匹配解法

题目描述

若两个正整数的和为素数,则这两个正整数称为'素数伴侣',例如 2 和 5、6 和 13。题目要做的事很直接:从给定的 N 个正整数里,尽可能多地配成这样的组合,输出最多能组成多少对。

输入:

有一个正偶数 N(N≤100),表示待挑选的自然数个数。后面跟着 N 个数字,范围是 [2,30000]。

输出:

输出一个整数 K,表示'最佳方案'里素数伴侣的对数。

解题思路

这题看起来像排列组合,实际上是标准的二分图最大匹配。关键点不在'怎么配',而在先把图拆对。

除了 2 以外,素数都是奇数。题目里的数都不小于 2,所以两个数之和如果是素数,基本就得是奇数;而奇数只能由一奇一偶相加得到。也就是说,奇数和偶数天然分属两边,能连边的只会是奇偶配对。

于是问题就变成了:把奇数放左边,偶数放右边,若两数之和是素数,就在它们之间连一条边。接下来要找的是最大匹配,也就是最多能选出多少条互不冲突的边。

实现上用 DFS 找增广路就够了。数据规模不大,匈牙利算法的写法完全能过,而且代码比别的图论套路更顺手。

代码实现

#include <iostream>
#include <cstring>
#include <vector>
using namespace std;

vector<int> G[105];
int pre[105];
bool used[105];

bool dfs(int k) {
    for (int i = 0; i < G[k].size(); ++i) {
        int neighbor = G[k][i];
        if (!used[neighbor]) {
            used[neighbor] = 1;
            if (pre[neighbor] == 0 || dfs(pre[neighbor])) {
                pre[neighbor] = k;
                return true;
            }
        }
    }
    return false;
}

int main() {
    bool isprime[80000];
    memset(isprime, 0, sizeof(isprime));
    for (int i = 2; i <= 80000; i++) {
        int j;
        for (j = 2; j < i; j++) {
            if (i % j == 0 || j * j > i) {
                break;
            }
        }
        if (j * j > i) {
            isprime[i] = 1;
        }
    }

    int N;
    int nums[105];
    int temp;

    while (cin >> N) {
        for (int i = 1; i <= N; ++i) {
            cin >> temp;
            nums[i] = temp;
        }

        for (int i = 1; i <= N; ++i) {
            for (int j = i + 1; j <= N; ++j) {
                if (isprime[nums[i] + nums[j]]) {
                    if (nums[i] % 2 == 1) {
                        G[i].push_back(j);
                    } else {
                        G[j].push_back(i);
                    }
                }
            }
        }

        memset(pre, 0, sizeof(pre));
        int count = 0;
        for (int i = 1; i <= N; ++i) {
            memset(used, 0, sizeof(used));
            if (dfs(i)) count++;
        }

        cout << count << endl;

        for (int i = 1; i <= N; ++i) G[i].clear();
    }
    return 0;
}

调试时要盯住的几个点

第一,素数表最好提前算好。N 只有 100,但数字最大到 30000,任意两数之和会到 60000,预处理一次比每次现判省事得多。

第二,建图方向别弄乱。这里不是把所有能配对的数都扔进同一个邻接表,而是只保留奇数到偶数的边。这样 DFS 的起点就明确了,匹配过程也不会乱计数。

第三,多组输入时记得清空状态。pre、used 和 G 都不能带到下一组,不然结果会飘得很明显。

这题的套路很固定,难点主要在把'素数伴侣'识别成二分图匹配。识别出来以后,代码其实不长,思路也比较稳。

目录

  1. 题目描述
  2. 解题思路
  3. 代码实现
  4. 调试时要盯住的几个点
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • LLama-Factory 集成 HuggingFace 镜像加速模型下载与训练
  • OpenClaw macOS 安装与配置指南
  • Claude Code 安装指南(Windows / macOS)
  • 芋道项目部署:前端直连与 Nginx 反向代理方案对比
  • Linux C++ 多进程编程:fork 函数与进程管理机制
  • AI 产品经理工作全流程详解:从需求定义到模型验收
  • MiniMax-M2 开源模型:编码与智能代理工作流优化
  • AI绘画建筑设计提示词:从基础到高级的完整创作指南
  • OpenCode 使用指南:AI Skills 安装与配置教程
  • 法律人使用 AI 大模型指南:Prompt 工程与场景应用
  • Cursor Chat Browser:浏览和管理 Cursor AI 聊天历史的 Web 应用
  • OpenClaw 开源机器人实现空间智能体记忆
  • 9款AI论文工具横向对比与使用指南
  • 微服务链路追踪实战:SkyWalking 与 Zipkin 架构对比及性能优化
  • R 语言在 AIGC 时代的数据科学应用与实战
  • 华为设备 SSH 远程登录配置实战
  • 前端 SSG:静态站点生成实战与架构选择
  • InChIKey 分子指纹:从哈希原理到全球监管合规实战
  • 快速排序核心思想与多种实现方式详解
  • PyCharm 配置 Anaconda 环境时找不到 Conda 环境的解决方法

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online