Atcoder ABC 187 F - Close Group 题解

news/2024/7/24 5:27:56

题意

n n n个点( n ≤ 18 n\leq18 n18), m m m条边( m ≤ n ∗ ( n − 1 ) 2 m\leq\frac{n*(n-1)}{2} m2n(n1))你一个简单无向图,删去一些边(可以是0),使得图满足以下性质:

  • 任意两点 a a a b b b,如果 a a a b b b连通,那么 a a a b b b之间有边。

求满足条件最少的连通块数量。

思路

题目数据很小,状压走起!

首先我们设 f v f_v fv表示当顶点集合为 v v v时,最少的连通块数量。

然后我们先暴力枚举点集 v v v,判断这个点集 v v v是否为完全图。

此时我们想怎么转移。

我们可以发现当 v ′ v' v v v v的子集时, f v = m i n ( f v ′ + f v − v ′ ) f_v=min(f_{v'}+f_{v-v'}) fv=min(fv+fvv)

所以此时我们就要枚举 v ′ v' v

我们先把 v ′ = v v'=v v=v,然后我们接下来每次都把 v ′ = ( v ′ − 1 ) & v v'=(v'-1)\&v v=(v1)&v,此时 ( v ′ − 1 ) & v (v'-1)\&v (v1)&v肯定是 v v v的子集,因为如果 v ′ − 1 v'-1 v1中二进制下有一位为 1 1 1 v v v的这一位为 0 0 0,那么在 ( v ′ − 1 ) & v (v'-1)\&v (v1)&v的时候这个 1 1 1就不见了,因为 1 & 0 = 0 1\&0=0 1&0=0

接下来我们来算一下时间复杂度。

在枚举 v ′ v' v的时候,因为 v v v v ′ v' v的在二进制下每一位的关系只有三种情况, 1 / 0 1/0 1/0 1 / 1 1/1 1/1 0 / 0 0/0 0/0,也就是说,把所有枚举的情况乘起来,就是 3 n 3^n 3n,虽然 3 n ≥ 3 × 1 0 9 3^n\geq 3 \times 10^9 3n3×109,但是因为常数很小,所以还是可以过。

Code

#include<bits/stdc++.h>
using namespace std;
int n,m,mp[25][25],f[2621445];
int main() {
    int u,v;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
        scanf("%d%d",&u,&v),mp[u][v]=mp[v][u]=1;
    bool flag;
    memset(f,0x3f,sizeof(f));
    f[0]=0;
    for(int i=1;i<=(1<<n)-1;i++) {
        flag=true;
        for(int j=1;j<n;j++)
            if((i>>(j-1))&1)
                for(int l=j+1;l<=n;l++)
                    if((i>>(l-1))&1&&(!mp[j][l])) {
                        flag=false;
                        break;
                    }
        if(flag)
            f[i]=1;
    }
    for(int i=1;i<=(1<<n)-1;i++)
        for(int j=i;j;j=(j-1)&i)
            f[i]=min(f[i],f[j]+f[i^j]);
    printf("%d",f[(1<<n)-1]);
    return 0;
}

http://www.niftyadmin.cn/n/136161.html

相关文章

“小霞”黄绮珊绮望三十巡回演唱会将于3月18日杭州大剧院震撼开唱!

•中年成名 四十余载静待盛放 歌手黄绮珊&#xff0c;1991年正式进入歌坛&#xff0c;至今已满三十周年。黄绮珊前半生的歌手之路好像并不是那么顺畅。虽然一直有着华语乐坛的顶尖歌唱实力&#xff0c;但在45岁之前&#xff0c;黄绮珊一直处于“歌红人不红”的状态。不少人听过…

Kalman Filter in SLAM 系列文章

本系列文章详细推导和解释了 Kalman Filter 及其各种变种&#xff0c;最终目的是推导目前最常用的 Error state Kalman Filter (EsKF) 和 Error state Iterated Kalman Filter (EsIKF)。 但是由于想推导这两个算法&#xff0c;必须实现知道所依赖的基础的 Kalman Filter 变种算…

java面试准备2

值传递和引用传递 值传递&#xff1a;是指在调用函数时将实际参数复制一份传递到函数中去&#xff0c;这样在函数中如果对参数进行修改&#xff0c;将不会影响到实际参数&#xff0c;。 引用传递&#xff1a;是指在调用函数时将实际参数的地址直接传递到函数中&#xff0c;那么…

Java经典面试题——对比 Vector、ArrayList、LinkedList 有何区别?

典型回答 这三者都是实现集合框架中的 List &#xff0c;也就是所谓的有序集合&#xff0c;因此具体功能也比较近似&#xff0c;比如都提供按照位置进行定位、添加或者删除的操作&#xff0c;都提供迭代器以遍历其内容等。但因为具体的设计区别&#xff0c;在行为、性能、线程…

Git学习笔记(七)——其他操作

一、自定义Git Git除了配置user.name 和user.email 还有很多可配置项。 &#xff08;1&#xff09;命令git config --global color.ui true 让Git显示颜色&#xff0c;会让命令输出看起来更醒目.Git 会适当显示不同的颜色。 $ git config --global color.ui true查看分支会有…

PyTorch的自动微分(autograd)

PyTorch的自动微分(autograd) 计算图 计算图是用来描述运算的有向无环图 计算图有两个主要元素&#xff1a;结点&#xff08;Node&#xff09;和边&#xff08;Edge&#xff09; 结点表示数据&#xff0c;如向量、矩阵、张量 边表示运算&#xff0c;如加减乘除卷积等 用计算…

高可用集群的灰度升级

1. 概述用传统方式升级集群版本&#xff0c;通常需要先把全部节点关闭&#xff0c;然后一次性把整个集群全部节点的版本升级为新版本。升级时&#xff0c;业务必须中断。灰度升级是指可以按节点逐一进行版本升级的方式&#xff0c;在单个节点升级为新版本&#xff0c;并确保其稳…

Nuxt实战教程基础-Day01

Nuxt实战教程基础-Day01Nuxt是什么&#xff1f;Nuxt.js框架是如何运作的&#xff1f;Nuxt特性流程图服务端渲染(通过 SSR)单页应用程序 (SPA)静态化 (预渲染)Nuxt优缺点优点缺点安装运行项目总结前言&#xff1a;本教程基于Nuxt2&#xff0c;作为教程的第一天&#xff0c;我们先…