这个题唯一需要说的就是普通的匈牙利算法是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. highcharts图表

    最近项目中用到highcharts雷达图,如下 其实echarts就不错,echarts用canvas,highcharts用svg,各有特点 代码如下: index.html <!doctyp ...

  2. 用VirtualBox构建MySQL测试环境笔记

    网络环境: 宿主机:Win7 VirtualBox 4.1.4 + Ubuntu 11.10 server 64bit 宿主机使用网线的时候,客户机在Bridged Adapter模式下,使用Athe ...

  3. MVC5之路由机制

    ---恢复内容开始--- MVC是一种模式,是基于asp.net上的一种设计.路由机制不属于MVC,路由机制属于asp.net.因此,mvc的路由机制就是基于asp.net路由机制上的一种“自定制”. ...

  4. NFS挂载及写入故障

    最近在做架构时,分离出来一台图片服务器,图片服务器是通过NFS(网络文件系统)给两台web服务器提供图片存储的,在编辑NFS配置文件(/etc/exports)时:想了一下,允许访问NFS共享目录的范 ...

  5. Educational Codeforces Round 8 D. Magic Numbers

    Magic Numbers 题意:给定长度不超过2000的a,b;问有多少个x(a<=x<=b)使得x的偶数位为d,奇数位不为d;且要是m的倍数,结果mod 1e9+7; 直接数位DP;前 ...

  6. 2014年度辛星html教程夏季版第六节

    不知道这样大家会不会感觉枯燥,总之不管大家怎么样,辛星始终会陪伴大家的,期待您的关注和支持,也衷心的希望我的博客能让您少走弯路,获得更系统的知识. ***************表格********* ...

  7. Sublime Text 3之Package Control 安装

    1.通过快捷键 ctrl+` 或者 View > Show Console 打开控制台,然后粘贴以下安装代码: import urllib.request,os; pf = 'Package C ...

  8. <二> jQuery 语法

    通过jQuery你可以选择/查询html元素,并对它们进行操作.jQuery 使用的语法是 XPath 与 CSS 选择器语法的组合. $(this).hide() 隐藏当前html元素 $(&quo ...

  9. centos7和windows7双系统安装

    前些天安装了双系统(centos7+win7),其实网上关于这类的教程很多,这篇日志也只是针对本人安装过程中遇到的一些问题进行说明.我是按照先安装win7再安装centos7的顺序. 1.关于分区: ...

  10. ubuntu下firefox安装Adobe Flash Player

    转自ubuntu系统自带的火狐(firefox)如何安装Adobe Flash 当你刚装完系统,发现打开某些网站时,提示你"需要安装flash",然后你点击确定,过了一会,提示你安 ...