ATB213G Connectivity II 学习笔记
ATB213G Connectivity II 学习笔记
题意简述
给定一张 \(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$ 内的边状态随意。这就是此题的核心思想。 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号