LightOJ-1356 Prime Independence
来源:互联网 发布:遭遇网络来分期诈骗 编辑:程序博客网 时间:2024/06/08 05:29
题意:
找出一些数字的最大质独立集,就是集合能的所有数互相之间不会出现 a[i]==t*a[j] (t是质数) 的情况。
思路:
首先想最大独立集对于一般图是NP问题,通常只有求二分图最大独立集,然后就是如何把这些数字分为二分图。
能够想到如果一个数字等于另一个数字乘以一个质数,那么这两个数字的质因子分解应该只有这一个质数的差别。也就是只会多一个质数,数字上限只有500000,完全可以看一个数组储存某个数字是否存在,然后对每个数字分解质因子,找到他对于每个质因子能够找到的那个数,存在则加边,然后就把质因子是奇数与偶数的分成两边并且把只有一个质因子差别的连通,然后二分图匹配求最大独立集即可。
关于二分图匹配因为数量较大所以用匈牙利会tle,要用Hopcroft-Carp:
http://blog.csdn.net/kopyh/article/details/47058047
代码:
#define N 512345#define M 41234int flag,sum,summ,ave,ans,res,len,ans1,ans2;int a[N],b[N],num[N],pt[N];vector<int>g[M];int um[N],vm[N],n;int dx[N],dy[N],dis;bool vis[N];void inserts(int u, int v){ g[u].push_back(v);}bool searchP(){ queue<int>q; dis=INF; memset(dx,-1,sizeof(dx)); memset(dy,-1,sizeof(dy)); for(int i=1;i<=n;i++) if(um[i]==-1) { q.push(i); dx[i]=0; } while(!q.empty()) { int u=q.front();q.pop(); if(dx[u]>dis) break; for(int i=0;i<g[u].size();i++) { int v = g[u][i]; if(dy[v]==-1) { dy[v]=dx[u]+1; if(vm[v]==-1) dis=dy[v]; else { dx[vm[v]]=dy[v]+1; q.push(vm[v]); } } } } return dis!=INF;}bool dfs(int u){ for(int i=0;i<g[u].size();i++) { int v = g[u][i]; if(!vis[v]&&dy[v]==dx[u]+1) { vis[v]=1; if(vm[v]!=-1&&dy[v]==dis) continue; if(vm[v]==-1||dfs(vm[v])) { vm[v]=u;um[u]=v; return 1; } } } return 0;}int maxMatch(){ int res=0; memset(um,-1,sizeof(um)); memset(vm,-1,sizeof(vm)); while(searchP()) { memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++) if(um[i]==-1&&dfs(i)) res++; } return res;}bool mark[N];int pri[N],cnt;void SP(){ cnt=0; memset(mark,true,sizeof(mark)); mark[0]=mark[1]=false; for(int i=2;i<N;i++) { if(mark[i]) pri[cnt++]=i; for (int j=0;(j<cnt)&&(i*pri[j]<N);j++) { mark[i*pri[j]]=false; if (i%pri[j]==0) break; } }}void init(){ memset(b,-1,sizeof(b)); memset(num,0,sizeof(num)); memset(vm,-1,sizeof(vm)); memset(um,-1,sizeof(um)); for(int i=0;i<=n;i++) g[i].clear();}int main(){ int i,j,k,kk,t,x,y,z; #ifndef ONLINE_JUDGE freopen("test.txt","r",stdin); #endif SP(); scanf("%d",&k); kk=0; while(k--) { scanf("%d",&n); init(); for(i=1;i<=n;i++) scanf("%d",&a[i]); sort(a+1,a+1+n); for(i=1;i<=n;i++) b[a[i]]=i; for(i=1;i<=n;i++) { t = a[i];sum=0;summ=0; for(j=0;j<cnt&&pri[j]*pri[j]<=t;j++) if(t%pri[j]==0) { pt[sum++] = pri[j]; while(t%pri[j]==0) t/=pri[j],summ++; } if(t>1)pt[sum++]=t,summ++; num[i] = summ; for(j=0;j<sum;j++) { t = b[a[i]/pt[j]]; if(t<=i&&t>=0) { if((summ&1)==(num[t]&1))continue; if((summ&1)) inserts(i,t); else inserts(t,i); } } } printf("Case %d: %d\n",++kk,n-maxMatch()); } return 0;}
0 0
- LightOJ-1356 Prime Independence
- LightOJ 1356 Prime Independence (素数 二分图)
- LightOJ 1356 Prime Independence (素数+二分图)
- lightoj 1356 - Prime Independence 【质因子分解 奇偶构图 + HK优化】
- LightOJ 1356 Prime Independence(素数筛选法+最大独立集)(Hopcroft-Carp算法)
- Lightoj-1356 Prime Independence(质因子分解&&二分图最大独立集)
- Lightoj-1356 Prime Independence(质因子分解)(Hopcroft-Karp优化的最大匹配)
- LightOj1356-Prime Independence
- Light OJ 1356 Prime Independence 最大独立集+素数筛选
- 【最大独立集】Prime Independence
- LightOJ1356 Prime Independence(数论+匹配)
- LightOJ-1041-prime
- Prime Independence(质因子分解+二分图最大独立集)
- LightOJ 1356 && LightOJ 1336
- The Declaration of Independence
- 沖繩 And Independence
- chapter 2 Platform Independence
- 司法独立 judicial independence
- 解题报告 之 CodeForces 581C Developing Skills
- 最快让你上手ReactiveCocoa之进阶篇
- php 实现文件下载与上传
- Linux系统中的fork()函数详解
- TCP/IP详解卷1 读书笔记:第二章 链路层
- LightOJ-1356 Prime Independence
- Redis复制-续
- 《TCP/IP详解 卷一:协议》读书笔记--概述
- Light oj 1223 - Testing Mailboxes(记忆化)
- Git学习第三天
- AndroidUI 视图动画-透明动画效果 (AlphaAnimation)
- AbstractQueuedSynchronizer 源码理解
- 商品检索系统
- 测试用例设计