素数伴侣HJ28

2023-05-16

题目链接:素数伴侣_牛客题霸_牛客网

解法:最大匹配

        因为素数不可能是偶数,所以“素数伴侣”只能是一个奇数和一个偶数。由此我们可以创建二分图:一个子集全是奇数,另一个子集全是偶数,若两个节点值之和为素数则连接一条边。二分图创建好后就是求最大匹配问题了,可以用匈牙利算法或者最大流算法求解(判断素数可以用线性筛)

代码示例1(匈牙利算法):

#include <algorithm>
#include <cstdio>
#include <iostream>
#include <type_traits>
#include <vector>
using namespace std;

const int V = 60010, N = 105, M = 5010;
vector<int> primes;
bool tag[V];

int h[N], to[M], ne[M], idx;
void Add(int u, int v) {
	to[idx] = v, ne[idx] = h[u], h[u] = idx++;
}

void Init() {
	fill_n(h, N, -1);

	primes.reserve(3000);
	for (int i = 2; i < V; i++) {
		if (!tag[i]) primes.push_back(i);
		for (auto j : primes) {
			if (i * j >= V) break;
			tag[i * j] = true;
			if (i % j == 0) break;
		}
	}
}

int ar[N];
int match[N];
bool flag[N];
int n;

bool DFS(int u) {
	flag[u] = true;
	for (int i = h[u]; ~i; i = ne[i]) {
		int v = to[i];
		if (flag[v]) continue;
		flag[v] = true;
		if (!match[v] || DFS(match[v])) {
			match[v] = u;
			return true;
		}
	}
	return false;
}

int main() {
	Init();
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		scanf("%d", ar + i);
		for (int j = i - 1; j > 0; j--) {
			if (!tag[ar[i] + ar[j]]) {
				Add(i, j);
				Add(j, i);
			}
		}
	}

	int ans = 0;
	for (int i = 1; i <= n; i++) {
		if (ar[i] % 2) {
			fill_n(flag, N, false);
			if (DFS(i)) ++ans;
		}
	}

	printf("%d", ans);
}

代码示例2(最大流ISAP)

#include <algorithm>
#include <cstdio>
#include <iostream>
#include <type_traits>
#include <vector>
#include <queue>
using namespace std;

const int V = 60010, N = 105, M = 5010;
vector<int> primes;
bool tag[V];

int h[N], to[M], ne[M], wt[M], idx;
void Add(int u, int v, int w) {
	to[idx] = v, wt[idx] = w, ne[idx] = h[u], h[u] = idx++;
}

void Init() {
	fill_n(h, N, -1);

	primes.reserve(3000);
	for (int i = 2; i < V; i++) {
		if (!tag[i]) primes.push_back(i);
		for (auto j : primes) {
			if (i * j >= V) break;
			tag[i * j] = true;
			if (i % j == 0) break;
		}
	}
}

int ar[N];
int n;
// 源点、汇点
int ss, tt;
// 各个结点所在层
int layer[N];
// 各层节点数量
int cnt[N];

void BFS() {
	queue<int> qu;
	qu.push(tt);
	layer[tt] = 1;
	cnt[1] = 1;
	int u, v;
	while (qu.size()) {
		u = qu.front();
		qu.pop();
		for (int i = h[u]; ~i; i = ne[i]) {
			v = to[i];
			if (layer[v]) continue;
			layer[v] = layer[u] + 1;
			++cnt[layer[v]];
			qu.push(v);
		}
	}
}

int DFS(int u, int from, int inflow) {
	if (u == tt) return inflow;
	int res = 0;
	for (int i = h[u]; ~i; i = ne[i]) {
		int v = to[i], & w = wt[i];
		if (layer[v] != layer[u] - 1 || !w) continue;
		int outflow = DFS(v, i, min(inflow, w));
		w -= outflow;
		if (~from) wt[from] += outflow;
		res += outflow;
		inflow -= outflow;
		if (!inflow) return res;
	}

	if (!--cnt[layer[u]++]) layer[ss] = n << 1;
	++cnt[layer[u]];
	return res;
}

int main() {
	Init();
	scanf("%d", &n);
	ss = n + 1, tt = n + 2;
	for (int i = 1; i <= n; i++) {
		scanf("%d", ar + i);
		if (ar[i] % 2) {
			Add(ss, i, 1);
			Add(i, ss, 0);
		}
		else {
			Add(i, tt, 1);
			Add(tt, i, 0);
		}
		for (int j = i - 1; j > 0; j--) {
			if (!tag[ar[i] + ar[j]]) {
				Add(i, j, 1);
				Add(j, i, 1);
			}
		}
	}

	int ans = 0;
	BFS();
	while (layer[ss] <= n + 2) ans += DFS(ss, -1, 1 << 30);

	printf("%d", ans);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

素数伴侣HJ28 的相关文章

  • linux查看进程umask值,在Linux中设置UMASK值

    umask值用于设置用户在创建文件时的默认权限 xff0c 当我们在系统中创建目录或文件时 xff0c 目录或文件所具有的默认权限就是由umask值决定的 对于root用户 xff0c 系统默认的umask值是0022 xff1b 对于普通
  • C语言strrev()函数:字符串逆置(倒序、逆序)

    头文件 xff1a include lt string h gt strrev 函数将字符串逆置 xff0c 其原型为 xff1a char strrev char str 参数说明 str为要逆置的字符串 strrev 将str所指的字符
  • linux 配置smb 免密码,centos7安装使用samba服务器免密码登录简单配置

    samba简单安装和无密码分享 1 先安装服务器和客户端 root 64 localhost yum y install samba samba client 安装服务器和客户端 root 64 localhost rpm qi samba
  • 双系统linux触摸板不能用,windows系统与ubuntu双系统导致笔记本触摸板失灵的解决办法(非输入代码)...

    先说一下我现在的笔记本使用的系统 xff0c windows10 64位 xff0b ubuntu14 04 64位 这几天把ubuntu装好后本来毫无问题的 xff0c 用的飞起 xff5e 可是昨天不知道什么原因 xff0c 触摸板突然
  • centos npm install 超时报错

    使用npm install 时报错 root 64 localhost helloworld npm install forever g npm WARN registry Using stale data from https regis
  • 数据分析关键代码汇总

    头部引入 import pandas as pd import numpy as np import matplotlib pyplot as plt matplotlib inline import seaborn as sns impo
  • OpenStack入门篇(二十二)之实现阿里云VPC的SDN网络

    1 修改 etc neutron neutron conf配置 root 64 linux node1 vim etc neutron neutron conf defalut core plugin 61 ml2 service plug
  • 不想说再见~北京

    从事软件开发工作已经第九个年头 慢慢觉得人生就像编程 xff0c 需要不停的面对各种需求通过各种分析对比找到最优技术方案 以往的每次技术问题 xff0c 都能通过各种途径找到最优方案 但是人生很多时候不能尽善尽美 这次的需求有点棘手 xff
  • windows 下 putty 登陆服务器 显示matlab图形界面

    本文需要下载 putty exe 和 pscp exe xff1a http www chiark greenend org uk sgtatham putty download html Xming 主程序和字体 https source
  • 软件工程概论--课后作业1

    作业概况 xff1a 1 网站系统开发所需技术 1 基础内容 网页设计概述 网站设计制作的基本流程 色彩搭配在网站中的应用 网站用户界面的设计 网站广告的设计 网站中表格的使用 网站中层的应用 框架网站的制作 模板网站的制作 使用行为和Ja
  • VNC-Server安装及配置

    一 什么是VNC VNC Virtual Network Computer 是虚拟网络计算机的缩写 VNC 是一款优秀的远程控制工具软件 xff0c 由著名的 AT amp T 的欧洲研究实验室开发的 VNC 是在基于 UNIX 和 Lin
  • (转)Windows 内存管理

    1 xff0e Windows的内存结构 Windows 系统中的每个进程都被赋予它自己的虚拟地址空间 对于 32 位进程来说 xff0c 这个地址空间是 4GB xff0c 因为 32 位指针可以拥有从 0x00000000 至 0xFF
  • Kali系统换源

    安装好kali系统后要选择更换软件源 xff0c 尽量选择国内源 xff0c 更新速度快 在终端中输入 gedit etc apt sources list 打开源列表文件 xff0c 将以下源选择加入其中 xff0c 原来的内容要删除 k
  • SerialPort IOException Workaround in C#

    ref http zachsaw blogspot com 2010 07 serialport ioexception workaround in c html As promised I 39 ve whipped up a quick
  • LVM-逻辑卷常用命令和示意图

    功能 命令物理卷管理卷组管理逻辑卷管理扫描pvscanvgscanlvscan建立pvcreatevgcreatelvcreate显示pvdisplayvgdisplaylvdisplay删除pvremovevgremovelvremove
  • 卷基于快照进行恢复

    基于P版本 xff0c 对卷基于快照进行恢复的源码分析 1 特性描述 在pike版本中 xff0c openstack官网增加了一个新特性 xff0c Cinder volume revert to snapshot xff0c 该特性支持
  • 计蒜客 2019 蓝桥杯省赛 B 组模拟赛(一)

    D题 xff1a 马的管辖 二进制枚举方案 判断该方案是否全部能被覆盖 xff0c 将最优方案存下来并进行剪枝 include lt iostream gt include lt cstring gt include lt cstdio g
  • [bash] 查找替换文件

    bash 查找替换文件 写这个脚本也加深了对 bash 数组的理解 bin bash 2015 11 23 echo e 34 说明 n将文件放在 app tmp class目录下 xff0c 保证该目录下没有其他文件 n备份目录在 app
  • Mac M1芯片 安装Homebrew

    MacBook M1芯片安装代码如下 xff0c 打开终端输入 bin bash c 34 curl fsSL https cdn jsdelivr net gh ineo6 homebrew install install sh 34 看
  • 1.学习大纲

    1 朱有鹏嵌入式Linux核心课程 xff1a https item taobao com item htm spm 61 a230r 1 14 1 1fca1869rWwNpJ amp id 61 45153106151 amp ns 6

随机推荐

  • [工具整理] Debain(KDE)下常用工具

    前言 xff1a Debian安装了KDE桌面环境后 xff0c 发现好多有用的功能没有集成 xff0c 需要自己安装 这里主要介绍 xff1a 截图工具 云盘工具以及KDE上的网络管理工具 0x01 截图工具 xff1a 推荐使用 fla
  • 【转】汽车CAN总线

    概述 CAN xff08 Controller Area Network xff09 总线协议是由 BOSCH 发明的一种基于消息广播模式的串行通信总线 xff0c 它起初用于实现汽车内ECU之间可靠的通信 xff0c 后因其简单实用可靠等
  • 轻松搭建CAS 5.x系列(1)-使用cas overlay搭建SSO SERVER服务端

    概要说明 cas的服务端搭建有两种常用的方式 xff1a 1 基于源码的基础上构建出来的 2 使用WAR overlay的方式来安装 官方推荐使用第二种 xff0c 配置管理方便 xff0c 以后升级也容易 本文就是使用第二种方式 安装步骤
  • vnc连接报错“connection refused (10061)”

    排除 防火墙等等 xff0c 网络设置的错误外 xff0c 登录putty exe 使用以下命令来启动 vnc server 共两行 xff1a service vncserver start vncserver 之后弹出两个warning
  • ST-LINK V2 DIY笔记(一)

    最近一段时间调试STM32板子的时候 xff0c 都是用JLINK 43 杜邦线 xff0c 或者拿官方板子当STLINK用 xff0c 可以用 xff0c 但是体积比较大 xff0c 有时候觉得比较麻烦 正好前一阵手头项目少 xff0c
  • 驱动级键盘模拟(C#)(高手请飘过)

    游戏外挂一般分为三个级别 xff1a 初级是鼠标 键盘模拟 xff0c 中级是Call游戏内部函数 xff0c 读写内存 xff0c 高级是抓包 xff0c 封包的 脱机挂 xff08 完全模拟客户端网络数据 xff0c 不用运行游戏 xf
  • CentOS7安装配置VNCServer

    一 安装图形界面 1 安装X Window图形界面 shell gt yum y groupinstall 34 X Window System 34 shell gt yum y install gnome classic session
  • 【计算机本科补全计划】NFV/SDN初识(为了避免保研复试被电话面试)

    正文之前 所有的通信应用无非就是两部分组成 xff1a 计算和网络 这两者关系密不可分 xff0c 但两者关系严重缺乏对称性 xff0c 网络一直拖累着计算 就好像是发快递 xff0c 你打个包 xff08 计算 xff09 只需要几分钟
  • [!] CDN: trunk - Cannot perform full-text search because Algolia returned an error: 0: Cannot reach

    pod search XXXX 时报错 xff1a CDN trunk Cannot perform full text search because Algolia returned an error 0 Cannot reach any
  • 北大青鸟消防设备说明书_北大青鸟火灾报警控制器JB-TG/T-JBF-11S厂家使用说明书...

    北大青鸟火灾报警控制器JB TG T JBF 11S厂家 使用说明书 一 JB TG T JBF 11S火灾报警控制器主要技术指标 xff1a 型号JB TG T JBF 11S 供电主电AC220V 10 50Hz 巡检周期3秒 备电DC
  • linux测试音量,在Linux中获取C中的主音量

    我正试图在Linux中检索 可能稍后设置 主音量 我正在使用PulseAudio 但理想情况下它也适用于ALSA 我找到了关于如何设置音量的this非常有用的帖子 从中我能够推断出snd mixer selem get playback v
  • Linux之apt命令详解

    一 apt的简介 apt命令可以说是Linux系统下最为重要的命令 xff0c 安装 更新 卸载软件 xff0c 升级系统内核都离不开apt命令 apt的全称是Advanced Packaging Tool是Linux系统下的一款安装包管理
  • cas服务器作用,CAS服务器搭建

    CAS服务器搭建 目的 xff1a 搭建以jdbc方式连接数据库并认证用户信息 服务器源码下载地址 https github com apereo cas releases tag v4 2 1 解压后 xff0c 项目目录如下 xff1a
  • prometheus 最全面的书籍推荐

    https yunlzheng gitbook io prometheus book 转载于 https www cnblogs com kevincaptain p 10709575 html
  • 使用ubuntu搭建时间机器备份服务

    如何在ubuntu下搭建时间备份服务 折腾了很久 终于可以了 请严格按照下面的方式来操作 真正明白问题的 可以按照自己的思路来 我用的是ubnutu 16 04 安装配置netatalk sudo apt get install netat
  • sqlalchemy源代码阅读随笔(1)

    今天看的 xff0c 是url py模块 xff0c 这个在create engine中 xff0c 起到的最用很大 xff0c 其本质 xff0c 就是对访问数据库的url xff0c 进行操作管里 我们可以直接访问这个类 看一个简单的代
  • C++的中英文字符串表示(string,wstring)

    在C 43 43 中字符串类的string的模板原型是basic string template lt class Elem class traits 61 char traits lt Elem gt class Ax 61 alloca
  • iOS开发中UITableView和UITableViewCell的几种样式

    说了很久要写自己的技术博客 xff0c 由于执行力差 xff0c 一直拖到现在才开始写文章 我是一个刚进入软件行业还不到一年的小菜鸟 xff0c 没有什么技术可言 xff0c 然后就在这里斗胆妄自尊大的在博客园上写些东西 xff0c 还希望
  • ubuntu 16.04 + VMware Workstation 16player VCS +Verdi 安装备忘录

    经过了一周左右的煎熬 xff0c 终于将VCS 43 Verdi的验证环境搭建好了 xff0c 只能说很不容易 xff0c 在此作一叙述 xff0c 也是以备自己将来再在相同的地方摔跤 参考 下载软件 xff08 tb买一天会员就行 xff
  • 素数伴侣HJ28

    题目链接 xff1a 素数伴侣 牛客题霸 牛客网 解法 xff1a 最大匹配 因为素数不可能是偶数 xff0c 所以 素数伴侣 只能是一个奇数和一个偶数 由此我们可以创建二分图 xff1a 一个子集全是奇数 xff0c 另一个子集全是偶数