D. Shortest Cycle
floyd最小环模板题
奈何连模板都不知道
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <set>
#include <vector>
#include <cstring>
#include <cmath>
#include <iomanip>
#include <bitset>
using namespace std;
typedef long long LL;
const int M=1e5+500;
const int inf=1e8+7;
const int N=500;
int G[N][N],dis[N][N];
int n;LL a[M],flag[M]={0};
int init()
{
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) dis[i][j]=dis[j][i]=G[i][j]=G[j][i]=inf;
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
{
if(flag[i] & flag[j])
{
dis[i][j]=dis[j][i]=G[i][j]=G[j][i]=1;
}
}
}
int floyd()
{
int res=inf;
//cout<<"res is "<<res<<endl;
for(int k=1;k<=n;k++)
{
for(int i=1;i<k;i++)
for(int j=i+1;j<k;j++)
res=min(res,dis[i][j]+G[i][k]+G[k][j]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
dis[j][i]=dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
return res;
}
int main()
{
scanf("%d",&n);
LL temp;LL max_num=-1;
for(int i=1;i<=n;i++)
{
scanf("%I64d",&a[i]);
temp=a[i];
int cnt=1;
while(temp)
{
if(temp & 1) ++flag[cnt];
max_num=max(max_num,flag[cnt]);
cnt++;
temp/=2;
}
}
//cout<<"max_num is "<<max_num<<endl;
if(max_num>=3){printf("3");return 0;}
if(max_num<2){printf("-1");return 0;}
int NN=0;
for(int i=1;i<=n;i++) if(a[i]) flag[++NN]=a[i];
n=NN;
init();
int ans=floyd();
if(ans>10000) printf("-1");
else printf("%d",ans);
}