这个题唯一需要说的就是普通的匈牙利算法是O(nm)的,过不了

然后HK算法可以O(n^0.5m),这个算法可以每次找很多同样长度的最短增广路

分析见:http://www.hardbird.net/lightoj-1356-prime-independence%E6%9C%80%E5%A4%A7%E7%8B%AC%E7%AB%8B%E9%9B%86-hopcroft-carp%E7%AE%97%E6%B3%95/

#include <cstdio>
#include <iostream>
#include <ctime>
#include <vector>
#include <cmath>
#include <map>
#include <queue>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long LL;
const int N=4e4+;
const int INF=0x3f3f3f3f;
int prime[],cnt,T,n;
int a[N],p[][];
vector<int>fac[N],g[N];
void getprime(){
bool v[];
memset(v,,sizeof(v));
for(int i=;i*i<=;++i)
if(!v[i])
for(int j=i*i;j<=;j+=i)
v[j]=;
for(int i=;i<=;++i)
if(!v[i])prime[++cnt]=i;
}
int Mx[N],My[N],dx[N],dy[N],dis;
bool used[N];
bool SearchP(){
queue<int>q;
dis=INF;
memset(dx,-,sizeof(dx));
memset(dy,-,sizeof(dy));
for(int i=;i<=n;++i)
if(Mx[i]==-){
q.push(i);
dx[i]=;
}
while(!q.empty()){
int u=q.front();
q.pop();
if(dx[u]>dis)break;
for(int i=;i<g[u].size();++i){
int v=g[u][i];
if(dy[v]!=-)continue;
dy[v]=dx[u]+;
if(My[v]==-)dis=dy[v];
else{
dx[My[v]]=dy[v]+;
q.push(My[v]);
}
}
}
return dis!=INF;
}
bool dfs(int u){
for(int i=;i<g[u].size();++i){
int v=g[u][i];
if(!used[v]&&dy[v]==dx[u]+){
used[v]=true;
if(My[v]!=-&&dy[v]==dis)continue;
if(My[v]==-||dfs(My[v])){
My[v]=u;
Mx[u]=v;
return true;
}
}
}
return false;
}
int MaxMatch(){
int res=;
memset(Mx,-,sizeof(Mx));
memset(My,-,sizeof(My));
while(SearchP()){
memset(used,,sizeof(used));
for(int i=;i<=n;++i)
if(Mx[i]==-&&dfs(i))++res;
}
return res;
}
int main()
{
getprime();
int cas=;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
memset(p,-,sizeof(p));
for(int i=;i<=n;++i){
scanf("%d",&a[i]);
g[i].clear();
fac[i].clear();
int tot=,t=a[i];
for(int j=;prime[j]*prime[j]<=t;++j){
if(t%prime[j]==){
fac[i].push_back(prime[j]);
while(t%prime[j]==)t/=prime[j],++tot;
}
}
if(t>)fac[i].push_back(t),++tot;
p[tot&][a[i]]=i;
}
for(int i=;i<=n;++i){
if(p[][a[i]]!=-){
for(int j=;j<fac[i].size();++j){
int tmp=a[i]/fac[i][j];
if(p[][tmp]==-)continue;
g[i].push_back(p[][tmp]);
}
}
else{
for(int j=;j<fac[i].size();++j){
int tmp=a[i]/fac[i][j];
if(p[][tmp]==-)continue;
g[p[][tmp]].push_back(i);
}
}
}
printf("Case %d: %d\n",++cas,n-MaxMatch());
}
return ;
}

LightOJ 1356 Prime Independence 二分图最大独立集,HK算法的更多相关文章

  1. LightOJ - 1356 Prime Independence (二分图 最大独立集 素数打表)

    题意: 给你一个集合,让你从这个集合中挑选出几个数,使得这几个数中任意两个数相除后的值不能为素数 即挑选出来的这几个数不能互相冲突 最大独立集 = 所有点数 - 最大匹配数 呵..呵...原先用的二维 ...

  2. LightOJ 1356 Prime Independence(质因数分解+最大独立集+Hopcroft-Carp)

    http://lightoj.com/login_main.php?url=volume_showproblem.php?problem=1356 题意: 给出n个数,问最多能选几个数,使得该集合中的 ...

  3. LightOJ - 1356 Prime Independence (数论+二分图匹配)

    题意:有N个数的集合,其中选出若干个数组成一个子集,要求这个子集中的任意两个数a,b都不能通过a=k*b得到,其中k是一个素数.求这个子集最大的size. 分析:集合中任意两数的关系是二者之间是否之差 ...

  4. hdu2389 Rain on your Parade 二分图匹配--HK算法

    You’re giving a party in the garden of your villa by the sea. The party is a huge success, and every ...

  5. HDU2389:Rain on your Parade(二分图最大匹配+HK算法)

    Rain on your Parade Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 655350/165535 K (Java/Ot ...

  6. HDU2389 Rain on your Parade —— 二分图最大匹配 HK算法

    题目链接:https://vjudge.net/problem/HDU-2389 Rain on your Parade Time Limit: 6000/3000 MS (Java/Others)  ...

  7. 二分图匹配-HK算法

    先把代码贴上,其他南京回来再补了.. #include <cstdio> #include <cstdlib> #include <cstring> #includ ...

  8. hdu 2389(二分图hk算法模板)

    Rain on your Parade Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 655350/165535 K (Java/Ot ...

  9. POJ1469 COURSES 【二分图最大匹配&#183;HK算法】

    COURSES Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 17777   Accepted: 7007 Descript ...

随机推荐

  1. PHP - 5.4 Array dereferencing 数组值

    在5.4之前我们直接获取数组的值得方法如下 <?php $str = 'a;b;c;d'; list($value) = explode(';',$str); echo $value; 结果为: ...

  2. Linux下Qt环境的搭建

    之前一直使用Ubuntu软件中心中的Qt4开发Qt的应用程序,现在转到Linux下来做Qt5开发,但是必须从Qt官网上面下载对应的安装包,配置起来相对麻烦一些,这里介绍整个开发流程. 首先,在官网上面 ...

  3. MVC之重定向

    MVC的重定向主要通过RedirectResult和RedirectToRouteResult实现.很显然,这两个对象都是MVC返回对象ActionResult的两个继承,具体原理不赘述. 这两个方法 ...

  4. C# 格式化字符串(转载)

    1 前言 如果你熟悉Microsoft Foundation Classes(MFC)的CString,Windows Template Library(WTL)的CString或者Standard ...

  5. hdu 1427 dfs

    速算24点 题意:随机给你四张牌,包括 A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13).要求只用'+','-','*','/'运算符以及括号改变运算 顺序,使得最终 ...

  6. C语言的数据类型

    复习之余,做点笔记<C语言之数据类型> 一.整数数据类型 (1)整数数据类型 整数类型 char 字符型变量   1字节(8Bit) short 短整型      2字节(16Bit) i ...

  7. Win8.1设置窗口背景颜色为护眼色

    更改注册表 window+R --->输入regedit(点击确定后进入注册表编辑器) 需要修改以下两个地方,重启电脑生效: [HKEY_CURRENT_USER\Control Panel\C ...

  8. 开发错误日志之FTP协议传输文件问题

    从开发端用FTP协议向服务器(Linux系统)传输文件时,cat -A查询文件内容中行尾会有^M出现. 解决方案:改用SFTP协议上传文件.

  9. 给新人follow代码想到的

    这两天让新人(刚毕业,此前未接触前端)切了个页面,发现了一些问题,联想到自己初入前端的时候因为没人带不可避免的也走了很多弯路,所以借着跟他讲解的机会,在这里把新人切页面中常见的问题和不好的习惯列举一下 ...

  10. zoj 3757&&3758

    3757一个模拟题,简单,但容易错: 3758 大素数判定就行: #include<cstdio> #include<cstring> #include<algorith ...