牛客网多校1 Symmetric Matrix(递推)

本文探讨了一类特殊图结构——所有顶点度数为2的环状图,并通过动态规划方法推导出计数该类图结构种类数的递推公式。文章详细解释了递推过程,最终给出了一段实现该递推公式的C++代码。

题目:构造一个n*n的矩阵,使得Ai,i = 0,Ai,j = Aj,i,Ai,1+Ai,2+...+Ai,n = 2。求种类数。

题解:

  把构造的矩阵当成邻接矩阵考虑。那么所有点的度数都为2,且存在重边但不存在自环。这种情况的图为多个环,即每个点都在且仅在一个环里。考虑每次加一个点来递推dp[]。假设当前是第n个点,从前n-1个点中筛出(1~n-3)个点和第n个点形成环。设n-1个点中保留k个点,即筛出n-1-k个点和第n个点形成环。

递推方程为:f(n) = (n-1)f(n-2)+sigma(k:2->n-3)C(n-1,k)f(k)(n-1-k)!/2;

  其中(n-1)f(n-2)为从n-1个点中筛出1个点的情况。C(n-1,k)为从n-1个点中筛出k个点的组合数(k表示保留的个数)。(n-1-k)!表示筛出的n-1-k个数与第n个数一共n-k个数构成环的种数。

  /2是因为去掉像1 2 3 4 和 1 4 3 2这种对称的情况。但是当k=1时就不用/2所以就把k=1的情况先写出来。

然后就是化简递推方程:

                    C(n-1,k)f(k)(n-1-k)!/2 = f(k)(n-1)!/k!/2

                    f(n) = (n-1)f(n-2)+sigma(k:2->n-3)f(k)(n-1)!/k!/2

         (n-1)f(n-1) = (n-1)(n-2)f(n-3)+sigma(k:2->n-4)f(k)(n-1)!/k!/2

减一下就变成:f(n) = (n-1)f(n-1)+(n-1)f(n-2)-(n-1)(n-2)f(n-3)/2

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
int n;
ll m,dp[maxn];
int main()
{
    dp[1]=0;dp[2]=1;dp[3]=1;
    while(~scanf("%d%lld",&n,&m))
    {
        for(int i=4;i<=n;i++)
            dp[i]=(1ll*(i-1)*(dp[i-1]+dp[i-2])%m-1ll*(i-1)*(i-2)/2ll*dp[i-3]%m+m)%m;
        printf("%lld\n",dp[n]);
    }
    return 0;
}

 

在图神经网络(GNN)中,**Naively Symmetric Normalized Matrix** 是一种图的邻接矩阵归一化方式,通常用于图卷积网络(GCN)中,目的是让图的结构信息更适配神经网络的传播规则。 --- ### ✅ 定义:Naively Symmetric Normalized Matrix 是什么? 它通常表示为: $$ \tilde{A}_{\text{sym}} = D^{-\frac{1}{2}} A D^{-\frac{1}{2}} $$ 其中: - $ A $:图的邻接矩阵(adjacency matrix) - $ D $:度矩阵(degree matrix),是一个对角矩阵,$ D_{ii} = \sum_j A_{ij} $ - $ D^{-\frac{1}{2}} $:对度矩阵的每个对角元素取平方根倒数 这个矩阵是对称的(symmetric),并且每个元素都进行了对称归一化。 --- ### 🧠 为什么叫“Naively Symmetric”? - **对称性(Symmetric)**:因为 $ \tilde{A}_{\text{sym}} $ 是对称矩阵,即 $ \tilde{A}_{\text{sym}} = \tilde{A}_{\text{sym}}^T $。 - **“Naively”(朴素)**:是因为它在某些图结构中可能表现不够好,比如度数差异非常大的图。它假设所有边的权重都一样,没有考虑方向或边的权重变化。 --- ### 🧮 举个例子 考虑一个简单的图,其邻接矩阵 $A$ 和度矩阵 $D$ 为: $$ A = \begin{bmatrix} 0 & 1 & 1 \\ 1 & 0 & 1 \\ 1 & 1 & 0 \end{bmatrix}, \quad D = \begin{bmatrix} 2 & 0 & 0 \\ 0 & 2 & 0 \\ 0 & 0 & 2 \end{bmatrix} $$ 那么: $$ D^{-\frac{1}{2}} = \begin{bmatrix} \frac{1}{\sqrt{2}} & 0 & 0 \\ 0 & \frac{1}{\sqrt{2}} & 0 \\ 0 & 0 & \frac{1}{\sqrt{2}} \end{bmatrix} $$ 于是: $$ \tilde{A}_{\text{sym}} = D^{-\frac{1}{2}} A D^{-\frac{1}{2}} = \frac{1}{2} A $$ --- ### ✅ 在 GCN 中的应用 这是 **Kipf & Welling 的 GCN** 中使用的传播规则: $$ H^{(k)} = \sigma\left( \tilde{D}^{-\frac{1}{2}} \tilde{A} \tilde{D}^{-\frac{1}{2}} H^{(k-1)} W^{(k)} \right) $$ 其中: - $ \tilde{A} = A + I $:加上自环的邻接矩阵 - $ \tilde{D} $:对应的度矩阵 - $ W^{(k)} $:第 $k$ 层的可学习参数 - $ \sigma $:激活函数(如 ReLU) --- ### 🧪 为什么使用对称归一化? - **防止梯度爆炸/消失**:归一化让邻接矩阵的谱半径(最大特征值)控制在合理范围内。 - **平滑信息传播**:使得信息在图上传播更加均匀。 - **适用于无向图**:因为对称归一化只适用于无向图(邻接矩阵是对称的)。 --- ### 🔁 与非对称归一化(如 $D^{-1}A$)的区别 | 归一化方式 | 表达式 | 是否对称 | 特点 | |------------|--------|----------|------| | 对称归一化 | $D^{-1/2}AD^{-1/2}$ | ✅ 是 | 更稳定,适合无向图 | | 非对称归一化 | $D^{-1}A$ | ❌ 否 | 更适合有向图,但稳定性略差 | --- ### ✅ Python 示例:使用 PyTorch Geometric 实现对称归一化 ```python import torch from torch_geometric.nn import GCNConv from torch_geometric.data import Data # 构造一个简单图 edge_index = torch.tensor([[0, 1, 1, 2], [1, 0, 2, 1]], dtype=torch.long) x = torch.tensor([[-1], [0], [1]], dtype=torch.float) data = Data(x=x, edge_index=edge_index) # 使用 GCN 层(内部自动进行对称归一化) conv = GCNConv(1, 1) output = conv(data.x, data.edge_index) print("Output:", output) ``` --- ### ✅ 总结 | 问题 | 回答 | |------|------| | 什么是 Naively Symmetric Normalized Matrix? | 是一种图邻接矩阵的归一化方式:$ D^{-1/2} A D^{-1/2} $ | | 为什么叫“Naively”? | 因为它是一种简单、对称但可能不够灵活的归一化方式 | | 为什么用它? | 可以稳定图神经网络训练,防止信息扩散不均 | | 应用在哪? | GCN、Graph U-Net 等图神经网络中 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值