LightOJ 1356 Prime Independence 二分图最大独立集,HK算法
这个题唯一需要说的就是普通的匈牙利算法是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算法的更多相关文章
- LightOJ - 1356 Prime Independence (二分图 最大独立集 素数打表)
题意: 给你一个集合,让你从这个集合中挑选出几个数,使得这几个数中任意两个数相除后的值不能为素数 即挑选出来的这几个数不能互相冲突 最大独立集 = 所有点数 - 最大匹配数 呵..呵...原先用的二维 ...
- LightOJ 1356 Prime Independence(质因数分解+最大独立集+Hopcroft-Carp)
http://lightoj.com/login_main.php?url=volume_showproblem.php?problem=1356 题意: 给出n个数,问最多能选几个数,使得该集合中的 ...
- LightOJ - 1356 Prime Independence (数论+二分图匹配)
题意:有N个数的集合,其中选出若干个数组成一个子集,要求这个子集中的任意两个数a,b都不能通过a=k*b得到,其中k是一个素数.求这个子集最大的size. 分析:集合中任意两数的关系是二者之间是否之差 ...
- 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 ...
- HDU2389:Rain on your Parade(二分图最大匹配+HK算法)
Rain on your Parade Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 655350/165535 K (Java/Ot ...
- HDU2389 Rain on your Parade —— 二分图最大匹配 HK算法
题目链接:https://vjudge.net/problem/HDU-2389 Rain on your Parade Time Limit: 6000/3000 MS (Java/Others) ...
- 二分图匹配-HK算法
先把代码贴上,其他南京回来再补了.. #include <cstdio> #include <cstdlib> #include <cstring> #includ ...
- hdu 2389(二分图hk算法模板)
Rain on your Parade Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 655350/165535 K (Java/Ot ...
- POJ1469 COURSES 【二分图最大匹配·HK算法】
COURSES Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 17777 Accepted: 7007 Descript ...
随机推荐
- php中位运算的应用:货品的状态
效果如下图: 分析:用一个整数的二进制可以记录32状态 00000000 00000000 00000000 00000000 >>=0 从右往左保存这三个的状态: 精品选中,第一位设置 ...
- Python3 IO
在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中 ...
- C语言到底怎么了?
自2015年11月开始,所有C语言系列都呈现出衰落之势.在超过15年的时间里,C语言在编程语言排行榜中的占比一直有15%-20%,但今年却突然急转直下,目前占比已不足10%,且目前看来回天乏力. 那么 ...
- centos用yum安装mysql-server
1.安装:#yum -y install mysql-server 2.修改配置:#vi /etc/my.cnf 暂时修改一下编码(添加在密码下方添加): default-character-set ...
- python 列表推导的注意点
Code a = [1,2,2,3] b = [for item in a if item not in b] c = [] for item in a: if item not in c: c.ap ...
- HDU 3749 Financial Crisis
Financial Crisis 题意:给一个图,包含N ( 3 <= N <= 5000 )个点, M ( 0 <= M <= 10000 )条边 and Q ( 1 < ...
- Cygwin下设置ls显示颜色
vi ~/.bashrc 找到alias ls="xxxxxxxxxxxxxxxxxxxxxxxx"这一项,把注释去掉 修改后的这一行为: alias ls='ls -hF --c ...
- 一步步学习ASP.NET MVC3 (5)——View从Action中获得数据
请注明转载地址:http://www.cnblogs.com/arhat 在上一章中,我们把Razor的模板技术给大家介绍了一下,当然模板中还有其他的知识点,这个以后我们还会继续讲解.本章我们主要讨论 ...
- Linux安装包
关于SWT SWT首先要在Eclipse中添加SWT的安装包:Windowsbuilder Pro.下载路径:http://www.eclipse.org/windowbuilder/download ...
- MJRefreshFooterView
实例化header和footer _header = [MJRefreshHeaderView header]; _header.scrollView = _tableView; 设置header和f ...