[Codeforces 1205B]Shortest Cycle(最小环)

题面

给出n个正整数\(a_i\),若\(a_i \& a_j \neq 0\),则连边\((i,j)\)(注意i->j的边和j->i的边看作一条。问连边完图的最小环长度

\(n \leq 10^5,0 \leq a_i \leq 10^{18}\)

分析

我们按位考虑.显然满足第i位为1的所有数两两之间都有边,构成一个完全图.

统计第i位为1的数,如果第i位为1的数超过2个,就直接输出3(这3个构成一个最小环)。如果有2个,就连一条边.注意点的编号要离散化,因为前面可能有很多0,导致满足条件的(i,j)编号很大。

因为要建图的时候,每一位最多建一条边,边数<64,点数<128,floyd求最小环\(O(n^3)\)可以卡过

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#define INF 0x3f3f3f3f3f3f3f3f
#define maxv 1000
#define maxn 100000
using namespace std;
typedef long long ll;
int n;
ll a[maxn+5];
vector<int>vis[70];
int cnt=0;
int tp[maxn+5];
ll ans=0;
ll edge[maxv+5][maxv+5];
ll dist[maxv+5][maxv+5];
void floyd(){
for(int k=1;k<=cnt;k++){
for(int i=1;i<k;i++){
for(int j=i+1;j<k;j++){
if(dist[i][j]==INF||edge[i][k]==INF||edge[k][j]==INF) continue;
//防止加法溢出
if(dist[i][j]+edge[i][k]+edge[k][j]<ans){
ans=dist[i][j]+edge[i][k]+edge[k][j];
}
}
}
for(int i=1;i<=cnt;i++){
for(int j=1;j<=cnt;j++){
if(dist[i][j]>dist[i][k]+dist[k][j]){
dist[i][j]=dist[i][k]+dist[k][j];
}
}
}
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%I64d",&a[i]);
for(ll i=0;i<64;i++){
for(int j=1;j<=n;j++){
if(a[j]&(1ll<<i)) vis[i].push_back(j);
}
}
for(int i=0;i<64;i++){
if(vis[i].size()>2){
printf("3\n");
return 0;
}
}
for(int i=0;i<64;i++){
if(vis[i].size()==2){
tp[++cnt]=vis[i][0];
tp[++cnt]=vis[i][1];
}
}
sort(tp+1,tp+1+cnt);
cnt=unique(tp+1,tp+1+cnt)-tp-1;
memset(edge,0x3f,sizeof(edge));
memset(dist,0x3f,sizeof(dist));
ans=INF;
for(int i=0;i<64;i++){
if(vis[i].size()==2){
int u=lower_bound(tp+1,tp+1+cnt,vis[i][0])-tp;
int v=lower_bound(tp+1,tp+1+cnt,vis[i][1])-tp;
// printf("%d %d\n",u,v);
edge[u][v]=edge[v][u]=1;
}
}
memcpy(dist,edge,sizeof(edge));
floyd();
if(ans==INF) printf("-1\n");
else printf("%d\n",ans);
}

最新文章

  1. IIS 设置默认首页静态页,无静态页,走路由
  2. spring boot 添加jsp支持注意事项
  3. C#--属性
  4. MVC5-8 ViewData、ViewBag、TempData分析
  5. Codeforces7C 扩展欧几里得
  6. linux 网桥的配置与实现
  7. Python Quick Start
  8. Filter过滤器
  9. STL总结之list
  10. (转载)MySQL数据类型中DECIMAL的作用和用法
  11. redis7--hash set的操作
  12. 给自己的 MAC 添加一个桌面日历
  13. Bootstrap学习笔记(二)---常见工具和流程导航范例
  14. ActiveMQ笔记:一个高稳定,可扩展的的部署方案
  15. Docker 堆栈
  16. k-th smallest 问题总结
  17. String中concat方法小记
  18. Netty源码分析第6章(解码器)----&gt;第3节: 行解码器
  19. Rest架构下的增删改查
  20. [转]iOS开发new与alloc/init的区别

热门文章

  1. 一、MyBatis基本使用,包括xml方式、注解方式、及动态SQL
  2. SQL查询语句备忘录
  3. onload + setTimeout 用法,制作广告弹框效果
  4. 文件/大文件上传功能实现(JS+PHP)全过程
  5. k8s登录harbor报错:Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request cance
  6. Bellman-ford算法与SPFA算法思想详解及判负权环(负权回路)
  7. Build安装版的UE4
  8. uploadify加ASP.NET MVC3.0上传文件(可多条)
  9. 180128-----Java面试题
  10. NSDate 那点事