Prime Independence LightOJ - 1356 (HK 最大独立集 板子)

Posted smallhester

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Prime Independence LightOJ - 1356 (HK 最大独立集 板子)相关的知识,希望对你有一定的参考价值。

题意:给你一组数,求一个最大的子集,要求任意两个的倍数都不是素数倍

题解:将每一个数按照质因数奇偶分开,同为奇偶的肯定是合数倍,在奇偶中刚好是素数倍的建边,跑二分图最大独立集,n - 匹配数就是答案

 

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<map>
#include<set>
#include<vector>
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f
#define eps 1e-10
const int MAXN = 4e4 + 10;
const int MOD = 1e9+7;
const int MAXX = 500005;
int prime[MAXX];
int num[MAXN],pos[MAXX];
int n;

void getprime()
    memset(prime,0,sizeof prime);
    for(int i = 2; i <= MAXX; i++)
        if(!prime[i]) prime[++prime[0]] = i;
        for(int j = 1 ;j <= prime[0] && prime[j] <= MAXX / i; j++)
            prime[prime[j] * i] = 1;
            if(i % prime[j] == 0) break;
        
    


vector<int>G[MAXN];
int uN;
int Mx[MAXN],My[MAXN];
int dx[MAXN],dy[MAXN];
int dis;
bool used[MAXN];
void addedge(int u,int v) 
    G[u].push_back(v);


bool SearchP()
    queue<int>que;
    dis = INF;
    memset(dx,-1,sizeof dx);
    memset(dy,-1,sizeof dy);
    for(int i = 1; i <= uN; i++)
        if(Mx[i] == -1)
            que.push(i);
            dx[i] = 0;
        
    
    while(!que.empty())
        int u = que.front();
        que.pop();
        if(dx[u] > dis) break;
        int sz = G[u].size();
        for(int i = 0; i < sz; i++) 
            int v = G[u][i];
            if(dy[v] == -1) 
                dy[v] = dx[u] + 1;
                if(My[v] == -1) dis = dy[v];
                else 
                    dx[My[v]] = dy[v] + 1;
                    que.push(My[v]);
                
            
        
    
    return dis != INF;


bool dfs(int u) 
    int sz = G[u].size();
    for (int i = 0; i < sz; i++) 
        int v = G[u][i];
        if(!used[v] && dy[v] == dx[u] + 1) 
            used[v] = true;
            if(My[v] != -1 && dy[v] == dis) continue;
            if(My[v] == -1 || dfs(My[v])) 
                My[v] = u;
                Mx[u] = v;
                return true;
            
        
    
    return false;


int MaxMatch() 
    int res = 0;
    memset(Mx,-1,sizeof Mx);
    memset(My,-1,sizeof My);
    while(SearchP()) 
        memset(used,false,sizeof used);
        for (int i = 1; i <= uN; i++) 
            if(Mx[i] == -1 && dfs(i)) res++;
        
    
    return res;

int factor[105][2];
int fatcnt;
int sum;
int getFactors(int x) 
    fatcnt = 0;
    int tmp = x;
    for (int i = 1; prime[i] <= tmp / prime[i]; i++) 
        factor[fatcnt][1] = 0;
        if (tmp % prime[i] == 0) 
            factor[fatcnt][0] = prime[i];
            while (tmp % prime[i] == 0) 
                factor[fatcnt][1] ++;
                tmp /= prime[i];
                sum++;
            
            fatcnt++;
        
    
    if(tmp != 1) 
        factor[fatcnt][0] = tmp;
        factor[fatcnt++][1] = 1;
        sum++;
    
    return fatcnt;

void init() 
    uN = 0;
    memset(pos,0,sizeof pos);
    for(int i = 0;i <= n; i++)
        G[i].clear();


int main()

    getprime();
    int t;
    scanf("%d",&t);
    int ca = 1;
    while(t--) 
        init();
        scanf("%d", &n);
        uN = n;
        for (int i = 1; i <= n; i++) 
            scanf("%d", &num[i]);
            pos[num[i]] = i;
        
        for (int i = 1; i <= n; i++) 
           sum = 0;
           int pnum = getFactors(num[i]);
           for(int k = 0; k < pnum; k++) 
               if(pos[num[i] / factor[k][0]] != 0) 
                   if(sum & 1)
                        addedge(pos[num[i]],pos[num[i] / factor[k][0]]);
                   else
                       addedge(pos[num[i] / factor[k][0]], pos[num[i]]);
               
           
        
        printf("Case %d: %d\n",ca++,n - MaxMatch());
    

 

以上是关于Prime Independence LightOJ - 1356 (HK 最大独立集 板子)的主要内容,如果未能解决你的问题,请参考以下文章

Prime Independence LightOJ - 1356 (HK 最大独立集 板子)

LightOJ 1356 Prime Independence(质因数分解+最大独立集+Hopcroft-Carp)

lighto1033_区间dp

R语言分类变量独立性检验(Tests of independence)使用Fisher精确检验fisher.test函数检验分类变量的独立性( test of independence)

Understanding Density Independence in Android

R卡方独立性检验(Chi-Square Test of Independence)