问题:
给你n个值 如果相与$(&)$不为0 则建边 求最小环
memcpy(dis,g,sizeof(dis)); for(int k=1;k<=200;k++) { for(int i=1;i<k-1;i++) for(int j=i+1;j<=k-1;j++) ans=min(ans,g[i][k]+g[k][j]+dis[i][j]); for(int i=1;i<=200;i++) for(int j=1;j<=200;j++) dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]); }
#include<bits/stdc++.h> using namespace std; const int maxn=1e5+5; long long a[maxn]; int n,Next[1500],End[1500],Last[maxn],tot,fa[maxn],Dep[maxn],ans=maxn; int g[1000][1000],dis[1000][1000]; int m; int ccc=0; int mmm[2000000]; inline void link(int a,int b) { Next[++tot]=Last[a];Last[a]=tot;End[tot]=b; } bool book[maxn]; void dfs() { memcpy(dis,g,sizeof(dis)); for(int k=1;k<=200;k++) { for(int i=1;i<k-1;i++) for(int j=i+1;j<=k-1;j++) ans=min(ans,g[i][k]+g[k][j]+dis[i][j]); for(int i=1;i<=200;i++) for(int j=1;j<=200;j++) dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]); } } int main() { //freopen("data.in","r",stdin); cin>>n; for(int i=1;i<=n;i++)cin>>a[i]; for(int i=1;i<=200;i++) for(int j=1;j<=200;j++) g[i][j]=1000000; for(int i=0;i<=60;i++) { int cnt=0,A=0,B=0; for(int j=1;j<=n;j++) if((a[j]>>i)&1) { if(!A){A=j;if(!mmm[A]) mmm[A]=++ccc;A=mmm[A];} else {B=j;if(!mmm[B]) mmm[B]=++ccc;B=mmm[B];} cnt++; } if(cnt>=3){cout<<3;return 0;} if(cnt==2&&A&&B)g[A][B]=1,g[B][A]=1; } dfs(); if(ans==maxn)cout<<-1; else cout<<ans; }
Codeforces 1206/problem/D Shortest Cycle Floyd求最小环
原文:https://www.cnblogs.com/OIEREDSION/p/11380369.html