Lightoj-1356 Prime Independence(质因子分解)(Hopcroft-Karp优化的最大匹配)
题意:
找出一个集合中的最大独立集,任意两数字之间不能是素数倍数的关系。
思路:
最大独立集,必然是二分图。
最大数字50w,考虑对每个数质因子分解,然后枚举所有除去一个质因子后的数是否存在,存在则建边,考虑到能这样建边的数一定是质因子个数奇偶不同,所以相当于按奇偶区分建立了二分图,然后求二分图最大匹配,得到最大独立集就行了。
有一点这个题数据比较大,直接匈牙利炸了,要Hopcroft-Karp优化才能过。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <string>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#define inf 0x3f3f3f3f
#define met(a,b) memset(a,b,sizeof a)
#define pb push_back
using namespace std;
typedef long long ll;
const int N = 5e4+;
int n,m,sum,res,flag;
bool mark[*N];
int pri[N],cnt;
void SP()
{
cnt=;
memset(mark,true,sizeof(mark));
mark[]=mark[]=false;
for(int i=; i<*N; i++)
{
if(mark[i])
pri[cnt++]=i;
for (int j=; (j<cnt)&&(i*pri[j]<*N); j++)
{
mark[i*pri[j]]=false;
if (i%pri[j]==)
break;
}
}
}
int pos[*N],num[N];
int f[N];
int vm[N],um[N];
bool vis[N];
vector<int>g[N];
int dx[N],dy[N],dis;
void init()
{
n=m=;
memset(pos,,sizeof(pos));
memset(f,-,sizeof(f));
memset(vm,-,sizeof(vm));
memset(um,-,sizeof(um));
for(int i=; i<=sum; i++)
g[i].clear();
}
void inserts(int u, int v)
{
g[u].push_back(v);
}
bool searchP()
{
queue<int>q;
dis=inf;
memset(dx,-,sizeof(dx));
memset(dy,-,sizeof(dy));
for(int i=; i<=sum; i++)
if(um[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]==-)
{
dy[v]=dx[u]+;
if(vm[v]==-) dis=dy[v];
else
{
dx[vm[v]]=dy[v]+;
q.push(vm[v]);
}
}
}
}
return dis!=inf;
}
bool dfs(int u)
{
for(int i=; i<g[u].size(); i++)
{
int v = g[u][i];
if(!vis[v]&&dy[v]==dx[u]+)
{
vis[v]=;
if(vm[v]!=-&&dy[v]==dis) continue;
if(vm[v]==-||dfs(vm[v]))
{
vm[v]=u;
um[u]=v;
return ;
}
}
}
return ;
}
int maxMatch()
{
int res=;
while(searchP())
{
memset(vis,,sizeof(vis));
for(int i=; i<=sum; i++)
if(um[i]==-&&dfs(i)) res++;
}
return res;
}
int tmp[N],now,all;
void solve(int t,int tot)
{
now = all = ;
int tt=t;
for(int i=; i<cnt&&pri[i]*pri[i]<=tt; i++)
{
if(tt%pri[i]==)
tmp[now++] = pri[i];
while(tt%pri[i]==)
tt/=pri[i],all++;
}
if(tt>)tmp[now++] = tt, all++;
f[tot]=&all;
if(f[tot])n++;
else m++;
for(int i=; i<now; i++)
{
int x=t/tmp[i];
if(pos[x])
{
if(!f[tot])inserts(tot,pos[x]);
else inserts(pos[x],tot);
}
}
}
int main()
{
int i,j,k,cas,T,t,x,y,z;
SP();
scanf("%d",&T);
cas=;
while(T--)
{
scanf("%d",&sum);
init();
for(i=; i<=sum; i++)
scanf("%d",&num[i]);
for(i=; i<=sum; i++)
pos[num[i]] = i;
for(i=; i<=sum; i++)
solve(num[i],i);
printf("Case %d: %d\n",++cas,sum-maxMatch());
}
return ;
}
Lightoj-1356 Prime Independence(质因子分解)(Hopcroft-Karp优化的最大匹配)的更多相关文章
- 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. 分析:集合中任意两数的关系是二者之间是否之差 ...
- LightOJ 1356 Prime Independence 二分图最大独立集,HK算法
这个题唯一需要说的就是普通的匈牙利算法是O(nm)的,过不了 然后HK算法可以O(n^0.5m),这个算法可以每次找很多同样长度的最短增广路 分析见:http://www.hardbird.net/l ...
- LightOJ - 1356 Prime Independence (二分图 最大独立集 素数打表)
题意: 给你一个集合,让你从这个集合中挑选出几个数,使得这几个数中任意两个数相除后的值不能为素数 即挑选出来的这几个数不能互相冲突 最大独立集 = 所有点数 - 最大匹配数 呵..呵...原先用的二维 ...
- P2043 质因子分解
P2043 质因子分解 题目描述 对N!进行质因子分解. 输入输出格式 输入格式: 输入数据仅有一行包含一个正整数N,N<=10000. 输出格式: 输出数据包含若干行,每行两个正整数p,a,中 ...
- P2043 质因子分解(阶乘的质因数分解)
P2043 质因子分解 对$n!$进行质因数分解的一种高效算法 首先,筛出$<=n$的素数 蓝后,对$n$反复除以$prime$,同时$cnt+=n/prime$ $n!$中含有该$prime$ ...
- LightOJ1336 Sigma Function —— 质因子分解、约数和为偶数
题目链接:https://vjudge.net/problem/LightOJ-1336 1336 - Sigma Function PDF (English) Statistics Forum ...
- hdu2389二分图之Hopcroft Karp算法
You're giving a party in the garden of your villa by the sea. The party is a huge success, and every ...
- BZOJ 1485: [HNOI2009]有趣的数列 [Catalan数 质因子分解]
1485: [HNOI2009]有趣的数列 Description 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所 ...
随机推荐
- BZOJ1927 [Sdoi2010]星际竞速 【费用流】
1927: [Sdoi2010]星际竞速 Time Limit: 20 Sec Memory Limit: 259 MB Submit: 2582 Solved: 1601 [Submit][St ...
- 设计一个JavaScript框架需要编写哪些模块
在这个js框架随处乱跑的时代,你是否考虑过写一个自己的框架?下面的内容也许会有点帮助. 一个框架应该包含哪些内容? 1. 语言扩展 大部分现有的框架都提供了这部分内容,语言扩展应当是以ECMAScri ...
- ubuntu使用su切换root用户提示“认证失败”
在虚拟机上安装了ubuntu,安装时提示设置密码,也设置了,但是在终端操作时,遇到权限不够的问题,于是就想到就是要切换root用户,获取最高权限. 当我使用 su 切换到root用户时,提示我输入密码 ...
- 一串跟随鼠标的DIV
div跟随鼠标移动的函数: <!DOCTYPE HTML><html><head> <meta charset="utf-8"> & ...
- 设计模式开篇综述(Java)
设计原则是规范,设计模式是技巧.如果在项目中能够灵活运用这些基础知识,那么我相信一定会得到意想不到的收获. 接下来的时间里,我将继续学习设计模式,将对每一个设计模式从以下几点进行分析和学习,如有不妥当 ...
- C# windows application Hello World
创建一个Windows application项目,然后可以调用里面的工具来生成代码. using System; using System.Collections.Generic; using Sy ...
- bootstrap table 怎么自适应宽度
<div class="table-responsive"> <table class="table text-nowrap"> < ...
- 【hdu3080】01背包(容量10^7)
[题意]n个物品,有wi和vi,组成若干个联通块,只能选取一个联通块,问得到m的价值时最小要多少空间(v).n<=50,v<=10^7 [题解] 先用并查集找出各个联通块. 这题主要就是v ...
- noip2014 提高组
T1 生活大爆炸版 石头剪刀布 题目传送门 就是道模拟题咯 #include<algorithm> #include<cstdio> #include<cstring&g ...
- Method and apparatus for providing total and partial store ordering for a memory in multi-processor system
An improved memory model and implementation is disclosed. The memory model includes a Total Store Or ...