给一个数组,对于每两个数加起来为素数那么就是一个集合,求不超过k个集合的最多数是多少

解法:二分图匹配,先打素数筛,预处理边集,匹配完之后分两种情况k>匹配数,那么可以直接输出匹配数*2,否则可以选取匹配数*2+min(k-匹配数,剩余没有匹配的而且有边的点),这里是因为没有匹配的点有边,连着之前匹配过的点,我们可以复用,只要保证不超过k个集合就可以了,

#include<bits/stdc++.h>
#include<ext/rope>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1using namespace std;
using namespace __gnu_cxx;const double g=10.0,eps=1e-7;
const int N=3000+10,maxn=2000000+10,inf=0x3f3f3f;bool prime[maxn],used[N];
int a[N];
int color[N];
vector<int>v[N];
void getprime()
{for(int i=2;i<maxn;i++){if(!prime[i]){for(int j=2*i;j<maxn;j+=i)prime[j]=1;}}
}
bool match(int x)
{used[x]=1;int sz=v[x].size();for(int i=0;i<sz;i++){int u=v[x][i];if(!used[u]){used[u]=1;if(color[u]==0||match(color[u])){color[u]=x;color[x]=u;return 1;}}}return 0;
}
int main()
{getprime();int t;scanf("%d",&t);while(t--){int n,k;scanf("%d%d",&n,&k);for(int i=1;i<=n;i++){scanf("%d",&a[i]);v[i].clear();color[i]=-1;}for(int i=1;i<=n;i++){for(int j=1+i;j<=n;j++){if(!prime[a[i]+a[j]]){v[i].pb(j);v[j].pb(i);color[i]=color[j]=0;}}}int sum1=0,sum2=0;for(int i=1;i<=n;i++){if(color[i]==0){memset(used,0,sizeof used);if(match(i))sum1++;}}for(int i=1;i<=n;i++)if(color[i]==0)sum2++;//     for(int i=1;i<=n;i++)cout<<color[i]<<endl;if(sum1>=k)printf("%d\n",2*k);else printf("%d\n",sum1*2+min(k-sum1,sum2));}return 0;
}
/************************/

View Code

转载于:https://www.cnblogs.com/acjiumeng/p/7785542.html

zoj3988 二分图匹配相关推荐

  1. Dinic二分图匹配 || Luogu P3386

    题面:[模板]二分图匹配 思路:Dinic实现二分图匹配,要建一个超级源点(S)和超级汇点(T),分别定为N+M+1和N+M+2 然后S去和N中的数建正边和反边,正边权值为1,反边权值为0:M中的数去 ...

  2. 二分图匹配匈牙利算法DFS实现

    1 /*==================================================*\ 2 | 二分图匹配(匈牙利算法DFS 实现) 3 | INIT: g[][]邻接矩阵; ...

  3. poj1274(二分图匹配)

    (一道基础的二分图匹配) 题目意思大概为N个牛和M个栅栏,一个牛和一个栅栏只能匹配一次,求最大匹配 直接套用二分图最大匹配模板即可 #include <iostream> #include ...

  4. poj2724(二分图匹配)

    题目大概意思为有部分奶酪需要处理,若两个奶酪的二进制只有一位不同,则可以一起处理,问最少需要处理几次 题目思路: 将可以一起处理的两个奶酪用边连接在一起,相当于边只连接二进制中有偶数个1的奶酪和二进制 ...

  5. 算法模板——二分图匹配

    实现功能为二分图匹配 原理:匈牙利算法,核心思想--匹配上了就配,没直接匹配上也要通过前面的腾出位置让这个匹配上(详见:趣写算法系列之--匈牙利算法) 本程序以Codevs2776为例 详见Codev ...

  6. 算法:ACM二分图匹配 HDU2063

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2063 摘录于互联网,原创作者redraiment,很详细的二分图匹配入门资料! 2063 过山车 Pr ...

  7. BZOJ1433 [ZJOI2009]假期的宿舍 - 二分图匹配

    题解 一道裸的二分图匹配,稍微有一点细节需要注意, 但是非常裸= = 本校并且住校的向自己的床和 自己认识的并且本校的人的床连边 离校的不需要向外连边 不是本校的就和自己认识的 并且是本校的人的床连边 ...

  8. POJ2536 二分图匹配

    题意:      有n只老鼠,m个洞,每个洞最多可以藏一只老鼠,每个老鼠的移动速度都是v,给你他们的当前坐标,和洞的坐标,突然老鹰来了,他们必须在s秒内跑到一个洞藏起来,问你最少有多少只老鼠被抓走了. ...

  9. URAL 1721 Two Sides of the Same Coin(二分图匹配,输出匹配对象)

    题意:给出n个人的信息,名字.特征.排名. 在排名相差2的前提下,特征为testdata可以与特征为statements的组队,特征为anything可以任何一人组队: 求最多匹配对数,并将每队名字输 ...

最新文章

  1. Spring Boot 监听 Redis Key 失效事件实现定时任务
  2. 菜鸟实时数仓2.0进阶之路
  3. 在机器学习分类中如何处理训练集中不平衡问题
  4. 软件质量保证与测试——Ad hoc Test
  5. 页面错误!请稍后再试_微信内嵌H5页面授权和分享
  6. 一文玩转 EhCache 缓存框架!
  7. mysql hibernate 乱码_mysql hibernate 乱码
  8. MATLAB矩阵运算
  9. 《无敌大冒险》技术支持
  10. HUSTOJ的安装与配置
  11. 区块链开发入门如何选择编程语言?
  12. 九宫格数独游戏——回溯算法——java实现
  13. MySQL中更新时间字段的更新时点问题
  14. HanLP《自然语言处理入门》笔记--1.新手上路
  15. 无脑安装教程:windows 10—QT5.9.5 + vs2013
  16. Elastix 设置呼叫转移
  17. SpringBoot配置多数据源数据库
  18. android unlock,安卓手机解锁助手 (A Unlock Tool)
  19. 场地通推出2.0 打造大学会务场地预定新平台
  20. 对不起,让大家久等了,RETURNS!

热门文章

  1. MySQL 为什么我的MySQL会“抖一下“?
  2. 104.路由协议有哪些?
  3. 人社部:截至三季度9757亿元养老保险基金到账运营
  4. 人脸识别入侵生活,但“刷脸”背后你的信息安全吗?
  5. Google 系两公司联手,要让无人车少“犯错”
  6. 毕业后年薪40万的专业成热门!125个岗位抢100个求职者
  7. win10计算机记录,启用Windows 10计算器中的历史记录功能 | MOS86
  8. html实现静态下来菜单js,JS代码实现静态导航菜单效果要用何主要代码?
  9. 原码一位乘法器设计_对原码、反码和补码的加深理解
  10. java 类对象可以调用静态方法吗