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

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

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

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

题目描述

若两个正整数的和为素数,则这两个正整数称为'素数伴侣',例如 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

更多推荐文章

查看全部
  • Open3D.Art 生成模型到拓竹打印的实用流程
  • Python 3.11 新特性:性能、异常与类型系统的变化
  • CoPaw 部署与定制实操笔记
  • IntelliJ IDEA 2026.1 EAP:Java 26、Spring Boot 4 与 Gradle 9 适配
  • YOLOv8 无人机道路病害识别的工程落地思路
  • 双指针滑动窗口:4 道经典题的思路拆解
  • NWPU VHR-10 遥感目标检测与 YOLO 实践
  • 老龄化压力下护理机器人的发展与分化
  • 文心一言 4.5:中文能力实测与本地部署记录
  • 在 WSL2 上部署 OpenClaw 的实操记录
  • 大语言模型词表裁剪的实现思路与代码
  • Vue 3 常用编程技巧整理
  • 在 Ubuntu 22.04 上部署 llama.cpp 和 llama-server
  • 大模型智能体做社会模拟时,真正难在哪
  • Pencil.dev 安装与实战:在 VS Code 里做设计
  • ThinkPHP 8 多应用架构搭建与落地要点
  • PaddleNLP 3.0:大模型训推一体与多硬件适配实践
  • TurboQuant 与 RWKV-6:大模型部署的两条降本路线
  • Unreal Engine 集成 VRM4U 的实战方案
  • Kali Linux 2025.4 发布:Wayland 默认、桌面与工具链更新

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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