A[i]&A[j]!=0连边,
求图中最小环
N>128 时必有3环
其他暴力跑
folyd最小环
#include<bits/stdc++.h> using namespace std; typedef long long ll; #define sc(x) scanf("%I64d",&x); #define read(A) for(int i=0;i<n;i++) scanf("%I64d",&A[i]); ll A[200005]; ll B[305][305]; ll dis[305][305]; ll N; #define inf 1e18 ll floyd() { ll MinCost = inf; for(int k=1; k<=N; k++) { for(int i=1; i<k; i++) for(int j=i+1; j<k; j++) MinCost = min(MinCost,dis[i][j]+B[i][k]+B[k][j]); for(int i=1; i<=N; i++) for(int j=1; j<=N; j++) dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]); } if(MinCost==inf)return -1; else return MinCost; } int main() { // ll N; sc(N); ll _k=1; for(int i=1; i<=N; i++) { sc(A[_k]); if(A[_k]!=0)_k++; } if(_k>=130) { puts("3"); } else { N=_k-1; for(int i=1; i<=N; i++) { for(int j=1; j<=N; j++) { if(i!=j&&(A[i]&A[j])) { B[i][j]=1; dis[i][j]=1; } else if(i==j) { B[i][j]=0; dis[i][j]=0; } else { B[i][j]=inf; dis[i][j]=inf; } } } cout<<floyd()<<'\n'; } }