求最小环
思路:当不为0的个数大于等于(log2(1e18))*3的时候,肯定会有三个数可以成环,直接打印
当小于这个值的时候,不到两百的数可以直接用floyd算最小环 板题
int dis[205][205],dp[205][205];
long long a[100005];
void solve()
{
int n;
cin>>n;
int num=0;
int cnt=0;
for(int i=1;i<=n;i++){
ll x;
cin>>x;
if(x)
a[++cnt]=x;
}
if(cnt>=200){
cout<<3<<endl;
return;
}
for(int i=1;i<=cnt;i++){
for(int j=1;j<=cnt;j++){
dp[i][j]=dis[i][j]=1e8;
}
}
for(int i=1;i<=cnt;i++){
for(int j=i+1;j<=cnt;j++){
if(a[i]&a[j]&&a[i]&&a[j]){
dis[i][j]=dis[j][i]=dp[i][j]=dp[j][i]=1;
}
}
}
int ans=1e8;
for(int k=1;k<=cnt;k++){
for(int j=1;j<k;j++){
for(int i=j+1;i<k;i++){
ans=min(ans,dis[j][i]+dp[j][k]+dp[k][i]);
}
}
for(int j=1;j<=cnt;j++){
for(int i=1;i<=cnt;i++){
dis[j][i]=min(dis[j][i],dis[j][k]+dis[k][i]);
}
}
}
if(ans==1e8){
ans=-1;
}
cout<<ans<<endl;
}