AFO

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");
}
posted @ 2019-09-16 21:10  ZUTTER☮  阅读(83)  评论(0编辑  收藏  举报