标签:最大团 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;
}
标签:最大团 inline str scanf turn printf sig 条件 bit
原文地址:https://www.cnblogs.com/yzxverygood/p/11519775.html