题面

题意:给你n个数,你可以选择2个和为质数的数为一对,每个数可以重复选择,你最多选k对,问你最多能选多少个不同数出来

题解:首先思考怎么样的数和为质数,2个偶数相加不行,除了1+1以外2个奇数相加不行,那么大致上,就是偶数+奇数,

这样很明显的发现这就是一个二分图,而且这是自动分好的,并不需要你建边的时候特殊考虑

所以对于能够加成质数的组合连边,跑最大匹配,如果现在有大于等于k个,那答案肯定就是选k个,每个里面一奇一偶,所以答案==k*2

可要现在不够k个呢?

还是先选ans*2个,剩下的,最好拿个样例画图出来,我们发现那些没在最大匹配的点,还可以有连向匹配里点的边,这时候选一条,答案就只能加1

所以答案就加上这种边的数量,当然也要小于总边数也要小于k,

(这里其实就利用匹配里的"板凳数组",初始化-1,有板凳坐就是0,最后剩下还是0的那些就是可以连一条边的)

那些人的题解好像对1进行特殊处理,搞的很复杂麻烦,可是我们再细想,选1+1这对,前提是1没法和任何数相加为质数了,不然选不到1+1,且收益也只有1

因为1+1只能带来1这个1个数,所以不用考虑,它本身就不会被纳入最大匹配里,这条边,只有在需要补的时候用上

 #include<bits/stdc++.h>
#define N 3005
#define M 2000010
using namespace std;
int pri[M],n,k,T,ans,sum,a[N],used[N],col[N];
vector<int>g[N];
int dfs(int x)
{
used[x]=;
for (int i=;i<g[x].size();i++)
{
int y=g[x][i];
if (!used[y])
{
used[y]=;
if (col[y]== || dfs(col[y]))
{
col[y]=x;
col[x]=y;
return ;
}
}
}
return ;
}
int main()
{
for (int i=;i<M;i++)
if (!pri[i])
for (int j=i*;j<M;j+=i) pri[j]=;
scanf("%d",&T);
while (T--)
{
scanf("%d%d",&n,&k);
memset(col,-,sizeof(col));
for (int i=;i<=n;i++) g[i].clear();
ans=sum=;
for (int i=;i<=n;i++) scanf("%d",&a[i]);
for (int i=;i<=n;i++)
for (int j=i+;j<=n;j++)
if (!pri[a[i]+a[j]])
{
col[i]=;
col[j]=;
g[i].push_back(j);
g[j].push_back(i);
}
for (int i=;i<n;i++)
if (!col[i])
{
memset(used,,sizeof(used));
ans+=dfs(i);
}
if (ans>=k) printf("%d\n",k*);else
{
for (int i=;i<=n;i++) if (!col[i]) sum++;
printf("%d\n",ans*+min(k-ans,sum));
}
}
}

ZOJ-3988 2017CCPC-秦皇岛 Prime Set 二分图最大匹配 匈牙利的更多相关文章

  1. UESTC 919 SOUND OF DESTINY --二分图最大匹配+匈牙利算法

    二分图最大匹配的匈牙利算法模板题. 由题目易知,需求二分图的最大匹配数,采取匈牙利算法,并采用邻接表来存储边,用邻接矩阵会超时,因为邻接表复杂度O(nm),而邻接矩阵最坏情况下复杂度可达O(n^3). ...

  2. HDU 1045 - Fire Net - [DFS][二分图最大匹配][匈牙利算法模板][最大流求二分图最大匹配]

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1045 Time Limit: 2000/1000 MS (Java/Others) Mem ...

  3. 51Nod 2006 飞行员配对(二分图最大匹配)-匈牙利算法

    2006 飞行员配对(二分图最大匹配) 题目来源: 网络流24题 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 第二次世界大战时期,英国皇家空军从沦陷国 ...

  4. HDU1068 (二分图最大匹配匈牙利算法)

    Girls and Boys Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  5. [POJ2446] Chessboard(二分图最大匹配-匈牙利算法)

    传送门 把所有非障碍的相邻格子彼此连一条边,然后求二分图最大匹配,看 tot * 2 + k 是否等于 n * m 即可. 但是连边不能重复,比如 a 格子 和 b 格子 相邻,不能 a 连 b ,b ...

  6. 二分图最大匹配(匈牙利算法) POJ 3041 Asteroids

    题目传送门 /* 题意:每次能消灭一行或一列的障碍物,要求最少的次数. 匈牙利算法:把行和列看做两个集合,当有障碍物连接时连一条边,问题转换为最小点覆盖数==二分图最大匹配数 趣味入门:http:// ...

  7. HDU - 1045 Fire Net (二分图最大匹配-匈牙利算法)

    (点击此处查看原题) 匈牙利算法简介 个人认为这个算法是一种贪心+暴力的算法,对于二分图的两部X和Y,记x为X部一点,y为Y部一点,我们枚举X的每个点x,如果Y部存在匹配的点y并且y没有被其他的x匹配 ...

  8. cogs 14. [网络流24题] 搭配飞行员 二分图最大匹配 匈牙利算法

    14. [网络流24题] 搭配飞行员 ★★   输入文件:flyer.in   输出文件:flyer.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述]     飞行大队有 ...

  9. ZOJ 1654 - Place the Robots (二分图最大匹配)

    题意:在一个m*n的地图上,有空地,草和墙,其中空地和草能穿透攻击光线,而墙不能.每个机器人能够上下左右攻击,问在地图上最多能放多少个不互相攻击的机器人. 这个题和HDU 1045 -  Fire N ...

随机推荐

  1. oracle从入门到精通复习笔记

    为方便大家跟着我的笔记练习,为此提供数据库表文件给大家下载:点我下载 描述一个表用 desc employees过滤重复的部门 select distinct department_id from e ...

  2. 【技术累积】【点】【编程】【13】XX式编程

    (原)函数式编程 核心概念 函数式一等公民(输入输出啥的都可以是函数): 纯函数,固定输入带来固定输出: 阅读性良好,无并发问题,但效率偏低: 大历史背景 旨在描述问题如何计算: 有两位巨擘对问题的可 ...

  3. [Advanced Algorithm] - Symmetric Difference

    题目 创建一个函数,接受两个或多个数组,返回所给数组的 对等差分(symmetric difference) (△ or ⊕)数组. 给出两个集合 (如集合 A = {1, 2, 3}和集合 B = ...

  4. (转)基于Metronic的Bootstrap开发框架经验总结(1)-框架总览及菜单模块的处理

    http://www.cnblogs.com/wuhuacong/p/4757984.html 最近一直很多事情,博客停下来好久没写了,整理下思路,把最近研究的基于Metronic的Bootstrap ...

  5. HTTP协议探索之Cache-Control

    缓存的存与用的控制 Cache-Control指定了请求和响应遵循的缓存机制.好的缓存机制可以减少对网络带宽的占用,可以提高访问速度,提高用户的体验,还可以减轻服务器的负担. Cache-Contro ...

  6. Combobox 下拉框赋值

    string sql = "select distinct RoleName from tb_Role"; DataTable dt = SqlHelper.DataTable(s ...

  7. Python3中替代Python2中cmp()函数的新函数(gt,ge,eq,le,lt)

    原文出处:http://blog.csdn.net/Artprog/article/details/52197779 Python3中已经不能使用cmp()函数了,被如下五个函数替代: import ...

  8. idea搭建第一个springboot

    1.打开idea开发工具,在菜单栏选择File-->New-->Project...-->Spring Initializer说明:社区版的idea是没有Spring Initial ...

  9. LOJ #6041. 「雅礼集训 2017 Day7」事情的相似度 LCT+SAM+线段树

    Code: #include<bits/stdc++.h> #define maxn 200003 using namespace std; void setIO(string s) { ...

  10. 【转载】java 监听文件或者文件夹变化的几种方式

    1.log4j的实现的文件内容变化监听 package com.jp.filemonitor; import org.apache.log4j.helpers.FileWatchdog; public ...