Prime Independence LightOJ - 1356


题目大意:给你n个数,你从这个集合中挑选出若干个数,使得这个集合的数里面两两之间a/b!=k[k是质数并且a>b]a/b!=k[k是质数并且a>b]a/b!=k[k是质数并且a>b]


解题思路:如果a/ba/ba/b是一个质数,那么如果a的质因数分解之后质数的总共个数如果是奇数那么b分解质因数后质因子个数就是偶数个,反之亦然。那么我们就可以将数按照质因子个数得奇偶性进行分成二分图如果两个数不能在同一集合就连一条边,问题就变成了在这个图上求最大独立集,根据二分图得性质就是二分图得最大独立集=点数-最大匹配数


由于这道题数据比较大只能用HK算法。


#include <iostream>
#include <cstdio>
#include <stack>
#include <sstream>
#include <vector>
#include <map>
#include <cstring>
#include <deque>
#include <cmath>
#include <iomanip>
#include <queue>
#include <algorithm>
#include <set>
#define mid ((l + r) >> 1)
#define Lson rt << 1, l , mid
#define Rson rt << 1|1, mid + 1, r
#define ms(a,al) memset(a,al,sizeof(a))
#define log2(a) log(a)/log(2)
#define _for(i,a,b) for( int i = (a); i < (b); ++i)
#define _rep(i,a,b) for( int i = (a); i <= (b); ++i)
#define for_(i,a,b) for( int i = (a); i >= (b); -- i)
#define rep_(i,a,b) for( int i = (a); i > (b); -- i)
#define lowbit(x) ((-x) & x)
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define INF 0x3f3f3f3f
#define hash Hash
#define next Next
#define count Count
#define pb push_back
#define f first
#define s second
using namespace std;
const int N = 5e5 + 10, mod = 1e9 + 7;
const double eps = 1e-10;
typedef long long ll;
typedef unsigned long long ULL;
typedef pair<int,int> PII;
template<typename T> void read(T &x)
{x = 0;char ch = getchar();ll f = 1;while(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();}while(isdigit(ch)){x = x*10+ch-48;ch=getchar();}x*=f;
}
template<typename T, typename... Args> void read(T &first, Args& ... args)
{read(first);read(args...);
}
int n;
int a[N];
int prime[N], cnt;
bool vis[N];
int lis[N];
int factor[40010];
vector<int> G[40010];
void init(int n)
{for(int i = 2; i <= n; ++ i){if(!vis[i]) prime[cnt ++] = i;for(int j = 0;j < cnt && i * prime[j] <= n; ++ j){vis[i * prime[j]] = true;if(i % prime[j] == 0) break;}}
}void slove()
{_for(i,1,n+1){int idx1 = 0, idx2 = 0;//记录质因子种类数和个数;int temp = a[i];for(int i = 0; prime[i]  <= temp / prime[i]; ++ i){if(temp % prime[i] == 0){while(temp % prime[i] == 0) temp /= prime[i], idx2 ++;factor[idx1 ++] = prime[i];}}if(temp != 1) factor[idx1 ++] = temp, idx2 ++;for(int j = 0; j < idx1; ++ j){int ord = lis[a[i]/factor[j]];if(ord){if(idx2 % 2) G[i].push_back(ord);else G[ord].push_back(i);}}}
}int cx[N],cy[N],visited[N],dy[N],dx[N];
int dis;
int bfs()
{queue<int> Q;dis = INF;memset(dx,-1,sizeof(dx));memset(dy,-1,sizeof(dy));for(int i=1; i<=n; i++){if(cx[i] == -1){Q.push(i);dx[i] = 0;}}while(!Q.empty()){int u = Q.front(); Q.pop();if(dx[u] > dis) break;for(int v=0; v<G[u].size(); v++){int i = G[u][v];if(dy[i] == -1){dy[i] = dx[u] + 1;if(cy[i] == -1) dis = dy[i];else{dx[cy[i]] = dy[i] + 1;Q.push(cy[i]);}}}}return dis != INF;
}int find(int u)
{for(int v=0; v<G[u].size(); v++){int i = G[u][v];if(!visited[i] && dy[i] == dx[u] + 1){visited[i] = 1;if(cy[i] != -1 && dis == dy[i]) continue;if(cy[i] == -1 || find(cy[i])){cy[i] = u;cx[u] = i;return 1;}}}return 0;
}int match(){int ans=0;memset(cx,-1,sizeof(cx));memset(cy,-1,sizeof(cy));while(bfs()){memset(visited,0,sizeof(visited));for(int i=1;i<=n;++i)if(cx[i]==-1&&find(i))ans++;}return ans;
}int main()
{init(N - 1);int T;read(T);_for(j,1,T+1){read(n);ms(lis,0);_for(i,1,n+1) G[i].clear();_for(i,1,n+1) read(a[i]),lis[a[i]] = i;slove();//建图printf("Case %d: %d\n",j,n-match());}return 0;
}

二分图HK算法[数论+二分图最大独立集]:Lightoj1356相关推荐

  1. 二分图匹配 Hopcroft-Carp (HK) 算法详解 附例题

    了解这个算法之前 首先了解一个概念 :增广路 增广路 :简单的说 ,是二分图匹配中的一条边,他总是从 左边集合的一个点出发通过一条没有被匹配的边连接到右边集合,再从该点通过一条 匹配过的边连接到右边集 ...

  2. 二分图(H-K算法)

    Problem Description You're giving a party in the garden of your villa by the sea. The party is a hug ...

  3. 二分图-匈牙利算法模板

    二分图就不赘述了,我在知识资料整理有相关资料. .最大匹配  .最小路径覆盖  .最小点覆盖  .最大独立集 最大匹配:二分图中边集最大的那个匹配 最小路径(边)覆盖:用尽量小的不想交简单路径覆盖有向 ...

  4. HDU - 2389 Rain on your Parade(Hopcroft-Krap算法求二分图最大匹配)

    题目链接:点击查看 题目大意:给出n个人和m个雨伞,t分钟后就要下雨了,现在给出每个人的坐标和速度,以及雨伞所在的坐标,每个雨伞只能容纳一个人,题目问最多有多少个人能不被淋到 题目分析:二分图最大匹配 ...

  5. `Computer-Algorithm` 二分图BipartiteGraph,最大匹配,最小点覆盖,最大独立集

    Contents 术语 二分图 旧解释 染色法判定二分图 经验总结 匈牙利算法计算最大匹配 例题 经验总结 点覆盖 在二分图中 例题 独立集 二分图中 例题 延伸阅读 术语 A Bipartite-G ...

  6. c语言最小费用流_策略算法工程师之路-图优化算法(一)(二分图amp;最小费用最大流)...

    目录 1.图的基本定义 2.双边匹配问题 2.1 二分图基本概念 2.2 二分图最大匹配求解 2.3 二分图最优匹配求解 2.4 二分图最优匹配建模实例 2.4.1 二分图最优匹配在师生匹配中的应用 ...

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

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

  8. 用匈牙利算法求二分图的最大匹配

    转载大神的!! 什么是二分图,什么是二分图的最大匹配,这些定义我就不讲了,网上随便都找得到.二分图的最大匹配有两种求法,第一种是最大流(我在此假设读者已有网络流的知识):第二种就是我现在要讲的匈牙利算 ...

  9. 利用匈牙利算法Hopcroft-Karp算法解决二分图中的最大二分匹配问题 例poj 1469 COURSES...

    首先介绍一下题意:已知,有N个学生和P门课程,每个学生可以选0门,1门或者多门课程,要求在N个学生中选出P个学生使得这P个学生与P门课程一一对应. 这个问题既可以利用最大流算法解决也可以用匈牙利算法解 ...

最新文章

  1. SCL定时 1500_iPhone12开售当天黄牛加价1500,哪里买最划算?
  2. 数学家田野:感谢坐冷板凳的那六年
  3. 建议手机电池85%以下去换电池
  4. 20190808:买卖股票的最佳时机
  5. jw player 5去掉share,info,embed页面
  6. complexType
  7. linux 串口 断帧,STM32f103使用串口中断发送数据时出现断帧是什么原因?
  8. python安卓吾爱_python编程视频教程v1.0.0下载_Python编程安卓版下载_吾爱游戏网
  9. python文档:控制流(if,for,函数,lambda等)
  10. RT-Thread:RW007-连接WIFI
  11. H5弹出是否打开微信APP的方式
  12. 2022-03-25 redis哨兵处理failover
  13. python拼多多推广多店爬虫
  14. 笨方法学python在线_“笨办法”学Python(第3版)
  15. RK3288源码编译
  16. 桌面下雪小程序 WIN32
  17. Java并发编程工具类:CountDownLatch、CyclicBarrier、Semaphore
  18. linux socket write()函数阻塞卡住线程问题(线程无法结束)write()非阻塞代码
  19. 内部披露!最新互联网大厂的薪资和职级一览
  20. 如何开发一个黑白照片还原成彩色,AI黑白图像图片上色系统毕业设计毕设作品

热门文章

  1. ubuntu18.04安装python虚拟环境:virtualenv 【亲测有效】
  2. scrapy爬虫框架初相识
  3. ACMNO.22 C语言-公约公倍2 写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果两个整数由键盘输入。 输入 两个数 输出 最大公约数 最小公倍数
  4. 收藏 | 多目标跟踪(MOT)入门
  5. 神经网络中的权重初始化一览:从基础到Kaiming
  6. 知乎热议:985计算机视觉研究生找不到工作?
  7. OpenCV深度神经网络实现人体姿态评估
  8. 数字图像处理必备基本知识
  9. 深度学习 VS 传统计算机视觉
  10. PyTorch中模型的可复现性