CF1205B
CF1205B
由鸽巢原理n比较大的时候直接输出3
然后剩下的就可以跑最小环
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
const int inf = 0x3f3f3f3f;
int n,m,d[185][185],w[202],f[185][185];
LL a[100001],k;
int main()
{
memset(d,0x3f,sizeof(d));
memset(f,0x3f,sizeof(f));
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
cin>>k;
if(k>0) a[++n]=k;
}
if(n>=180)
{
printf("3");
return 0;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i!=j && (a[i] & a[j])) f[i][j]=d[j][i]=1;
int res=inf;
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i!=j && j!=k && i!=k && f[i][j]!=inf && d[i][k]!=inf && d[k][j]!=inf)
res=min(res,d[i][k]+d[k][j]+f[i][j]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
}
if(res!=inf) printf("%d",res);
else printf("-1");
}