码迷,mamicode.com
首页 > 其他好文 > 详细

loj526「LibreOJ β Round #4」子集

时间:2019-09-14 19:21:33      阅读:90      评论:0      收藏:0      [点我收藏+]

标签:最大团   inline   str   scanf   turn   printf   sig   条件   bit   

分析

求满足条件的最大团

我们可以考虑建出补图

发现对于奇数之间和偶数之间

由于一定满足所以补图上一定可以将奇数一组偶数一组建成一个二分图

求二分图最大独立集即可

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m,d[1010],g[1010][1010],a[1010],b[1010],c1,c2,ans,T,used[1010],wh[1010];
inline bool work(int x){
    for(int i=1;i<=m;i++)
      if(g[x][i]&&used[i]!=T){
          used[i]=T;
          if(!wh[i]||work(wh[i])){
            wh[i]=x;
            return 1;
        }
      }
    return 0;
}
inline void go(){
    for(int i=1;i<=n;i++){
      ++T;
      if(work(i))ans++;
    }
}
signed main(){
    int i,j,k;
    scanf("%lld",&n);
    for(i=1;i<=n;i++){
      scanf("%lld",&d[i]);
      if(d[i]&1)a[++c1]=d[i];
        else b[++c2]=d[i];
    }
    n=c1,m=c2;
    for(i=1;i<=c1;i++)
      for(j=1;j<=c2;j++)
        if(__gcd(a[i],b[j])==1&&__gcd(a[i]+1,b[j]+1)==1)g[i][j]=1;
    go();
    printf("%lld",n+m-ans);
    return 0;
}

loj526「LibreOJ β Round #4」子集

标签:最大团   inline   str   scanf   turn   printf   sig   条件   bit   

原文地址:https://www.cnblogs.com/yzxverygood/p/11519775.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!