ATB213G Connectivity II 学习笔记

ATB213G Connectivity II 学习笔记

Luogu Link

题意简述

给定一张 \(n\)\(m\) 边的简单无向图 \(G\)。考虑删去任意自然数条边构成一个新图 \(G'\)。对于每个点 \(2\le k\le n\),求有多少张新图满足点 \(k\) 与点 \(1\) 连通。

\(n\le 17\)

做法解析

以下论述基于无向图。称图中所有点组成的集合为 \(V\)。称点集 \(S\) 内的边数为 \(\text{ecnt}_S\)

对于一个点集 \(s\),我们怎么去不重不漏统计让 \(s\) 内的点彼此连通的图的数量?方法是:枚举 \(s\) 所处的连通块的点集,记为 \(S\)。对于每个可能的 \(S\),我们要求 \(S\)\(V-S\) 间不能有边,然后 \(V-S\) 内的边状态随意。这就是此题的核心思想。

\(F_S\) 为只考虑点集 \(S\) 与其中的边时连通子图的个数。对于 \(k\) 的答案 \(ans_k\) 即为 \(=\sum_{\{1,k\}\subseteq S\subseteq V}F_S\times 2^{\text{ecnt}_{V-S}}\)

\(F_S\) 怎么求呢?正难则反,我们用所有方案数减去不连通子图的个数。对于求不连通子图的个数,我们也应用上面的思想,钦定一个点 \(u\in S\),枚举 \(u\) 所在的连通块 \(T\),并且认为 \(S-T\)\(T\) 不连通。则有柿子:\(F_S=2^{\text{ecnt}_S}-\sum_{u\in T \subset S} F_T\cdot2^{\text{ecnt}_{S-T}}\)

\(\text{ecnt}_S\) 怎么求呢?还是上述的思路:钦定一个点 \(u\in S\) 并初始化 \(\text{ecnt}_S=\text{ecnt}_{S-u}\),然后逐一判断 \(u\)\(S-u\) 中的每一个点是否连通,若联通就让 \(\text{ecnt}_S\) 加一。

时间复杂度:\(O(n2^n+3^n)\)

代码实现

#include <bits/stdc++.h>
using namespace std;
using namespace obasic;
using namespace omodint;
using mint=m998;
const int MaxN=17,MaxNs=3e2,MaxNa=1<<17;
int N,M,alf,X,Y,Gr[MaxN],lg2[MaxNa];
void addudge(int u,int v){Gr[u]|=(1<<v),Gr[v]|=(1<<u);}
int ecnt[MaxNa];mint pw2[MaxNs],F[MaxNa],ans[MaxN];
int lowbit(int x){return x&(-x);}
int main(){
    readis(N,M);alf=(1<<N)-1;
    for(int i=2;i<=alf;i<<=1)lg2[i]=lg2[i/2]+1;
    pw2[0]=1;for(int i=1;i<=M;i++)pw2[i]=pw2[i-1]*2;
    for(int i=1;i<=M;i++)readis(X,Y),addudge(X-1,Y-1);
    for(int s=1;s<=alf;s++){
        int l=lowbit(s),u=lg2[l],t=s-l;ecnt[s]=ecnt[t];
        for(int i=0;i<N;i++)if((t&(1<<i))&&(Gr[u]&(1<<i)))ecnt[s]++;
    }
    F[0]=1;
    for(int s=1;s<=alf;s++){
        int l=lowbit(s),u=lg2[l];F[s]=pw2[ecnt[s]];
        for(int t=(s-1)&s;t;t=(t-1)&s){
            if(t&l)F[s]-=F[t]*pw2[ecnt[s-t]];
        }
    }
    for(int s=1;s<=alf;s++){
        for(int i=1,c;i<N;i++){
            c=(1<<i)|1;
            if((s&c)==c)ans[i]+=F[s]*pw2[ecnt[alf-s]];
        }
    }
    for(int i=1;i<N;i++)writil(miti(ans[i]));
    return 0;
}```

### 反思总结
对于一个点集 $s$,我们怎么去不重不漏统计让 $s$ 内的点彼此连通的图的数量?方法是:枚举 $s$ 所处的连通块的点集,记为 $S$。对于每个可能的 $S$,我们要求 $S$ 和 $V-S$ 间不能有边,然后 $V-S$ 内的边状态随意。这就是此题的核心思想。
posted @ 2025-03-11 14:16  矞龙OrinLoong  阅读(22)  评论(0)    收藏  举报