首页 > 其他分享 >矩阵树定理学习笔记 & 洛谷 P4111 [HEOI2015]小 Z 的房间 题解

矩阵树定理学习笔记 & 洛谷 P4111 [HEOI2015]小 Z 的房间 题解

时间:2022-11-04 18:11:38浏览次数:71  
标签:洛谷 P4111 int 题解 定理 矩阵 行列式 bmatrix dfrac

矩阵树定理

拉普拉斯矩阵

无边权

设无向图 \(G\) 有 \(n\) 个结点,则拉普拉斯矩阵 \(L\) 是一个 \(n\times n\) 的矩阵,满足:

  • \(L_{i,i}(i\in G)\) 的值为结点 \(i\) 的度数。
  • \(L_{i,j}(i,j\in G,i \neq j)\) 的值为结点 \(i,j\) 之间相连的边数的相反数。

如下图:

Graph

它的拉普拉斯矩阵

\[L= \begin{bmatrix} 2 & -1 & -1 &0 \\ -1 & 3 & -1 &-1 \\ -1 & -1 & 3 & -1\\ 0 & -1 & -1 &2 \end{bmatrix} \]

有边权

推广一下:

  • \(L_{i,i}(i\in G)\) 的值为所有与结点 \(i\) 相连的边权和。
  • \(L_{i,j}(i,j\in G,i \neq j)\) 的值为边 \(i\to j\) 的权的相反数。

定理内容

严谨的定理内容参见 OI Wiki 上对矩阵树定理的叙述。

通俗来说,把拉普拉斯矩阵去掉任意的一行一列,得到的矩阵的行列式就是原图的生成树数量(带权就是所有生成树中边的积的和)。

证明

关于这个我也不会,可以去看文末《矩阵树定理(Matrix-tree Theorem)笔记》。

求矩阵的行列式

行列式有如下性质:

  • 将矩阵的两行交换,其行列式变成相反数。
  • 将矩阵的一行加上(另一行乘一个数),其行列式不变。
  • 三角矩阵的行列式为对角线的乘积。

利用这三条性质可以把矩阵变成三角矩阵,从而求出行列式。

比如刚才的矩阵(去掉第一行和最后一列):

\[\begin{bmatrix} 2 & -1 & -1\\ -1 & 3 & -1\\ -1 & -1 &3 \end{bmatrix} \]

将第一行乘 \(\dfrac{1}{2}\),加到第二、第三行去,再将第二行乘 \(\dfrac{3}{5}\),加到第三行去,最终形成的三角矩阵:

\[\begin{bmatrix} 2 & -1 & -1\\ 0 & \dfrac{5}{2} & -\dfrac{3 }{2}\\ 0 & 0 &\dfrac{8}{5} \end{bmatrix} \]

则其行列式为 \(2\times\dfrac{5}{2}\times\dfrac{8}{5}=8\)。

而原图恰好有 8 个生成树:

Spanning Tree

代码

回到本题,不难发现是道裸的矩阵树定理,时间复杂度 \(O(n^3m^3)\)。

/*
 * Title: P4111 [HEOI2015]小 Z 的房间
 * Source: 洛谷
 * URL: https://www.luogu.com.cn/problem/P4111
 * Author: Steven_lzx
 * Command: -std=c++23 -Wall -fno-ms-extensions
 * Date: 2022.11.4
 */
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MOD=1e9;
int n,m,cnt,ans=1,laplace[100][100]/*拉普拉斯矩阵*/,id[20][20],l;
char ch[20][20];
void change(int x,int y)
{
    laplace[x][x]++;
    laplace[y][y]++;
    laplace[x][y]--;
    laplace[y][x]--;
    return;
}
signed main()
{
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            do 
                scanf("%c",&ch[i][j]);
            while(ch[i][j]!='.'&&ch[i][j]!='*');
            if(ch[i][j]=='.')
                id[i][j]=++cnt;//编号
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(ch[i][j]=='.'&&ch[i+1][j]=='.')
                change(id[i][j],id[i+1][j]);
            if(ch[i][j]=='.'&&ch[i][j+1]=='.')
                change(id[i][j],id[i][j+1]);
        }
    }
    cnt--;
    for(int i=1;i<cnt;i++)
    {
        for(int j=i+1;j<=cnt;j++)
        {
            while(laplace[j][i])
            {
                l=laplace[i][i]/laplace[j][i];
                for(int k=1;k<=cnt;k++)
                    laplace[i][k]=(laplace[i][k]-laplace[j][k]*l%MOD+MOD)%MOD;
                for(int k=1;k<=cnt;k++)
                    swap(laplace[i][k],laplace[j][k]);
                ans*=-1;
            }
        }
    }
    for(int i=1;i<=cnt;i++)
        ans=(ans*laplace[i][i]%MOD+MOD)%MOD;
    printf("%lld\n",ans);
    return 0;
}

参考资料

标签:洛谷,P4111,int,题解,定理,矩阵,行列式,bmatrix,dfrac
From: https://www.cnblogs.com/2020gyk080/p/16858678.html

相关文章

  • 洛谷P2730 [USACO3.2]魔板 Magic Squares
    题目链接:点这里 一般这种从某种状态转移到目标状态的最短距离,都可以使用BFS来做。从题目给定的初始状态,依次执行题目给定的三种操作,分别是交换上下两行(操作A)、将最后......
  • 【题解】Luogu P8743 【[蓝桥杯 2021 省 A] 异或数列】
    最近刚好在刷博弈论,看到这道题没有题解,所以刚好来水一发题目链接[蓝桥杯2021省A]异或数列题目描述Alice和Bob正在玩一个异或数列的游戏。初始时,Alice和Bob......
  • Atcoder Beginner Contest ABC 275 Ex (H) Monster 题解
    先明确\(a_i\)是一个怪物的血量,\(b_i\)是攻击的代价。发现如果我们想攻击一个怪物,不如找出一个极大的包含它的区间,满足这个区间内所有怪物的攻击代价都不大于它本身的代价,......
  • 【题解】洛谷 P1134 [USACO3.2]阶乘问题
     1#include<iostream>2usingnamespacestd;34intmain(){5intn;6cin>>n;7intc=1,a=0,b=0;8for(inti=1;i......
  • LG4026 [SHOI2008]循环的债务 题解
    LG4026[SHOI2008]循环的债务给出三个整数\(x_1,x_2,x_3\)。\(x_1\)代表A欠B的钱数,\(x_2\)表示B欠C的钱数,\(x_3\)表示C欠A的钱数。接下来\(3\)行,每......
  • WiredTiger引擎编译 及 LT_PREREQ(2.2.6)问题解决
    近期需要为异构引擎做准备,wiredtiger以其优异的性能(B-tree和LSM-tree都支持)和稳定性(Mongodb的默认存储引擎)被我们备选为异构引擎里的一个子引擎,后续将深入wiredtiger......
  • CF 1749 题解
    比赛链接:https://codeforces.com/contest/1749题解:AB水题//bySkyRainWind#include<cstdio>#include<vector>#include<cstring>#include<iostream>#include......
  • P4774 倚天屠龙传 题解
    其实这道题的主体并不难,主要是细节很多我们可以把题目分成界限分明的两部分,第一部分,屠每条龙所用的剑只和当前拥有的剑有关。于是可以单独开一个数据结构按题目维护。另......
  • 2022 CSP-S题解
    T1:假期计划给定\(n\)个点\(m\)条边的无向图,每个点有一个点权。在图中选\(4\)个不同的点,从\(1\)号点出发完成\(5\)段行程:\(1\toA\toB\toC\toD\to1\),每......
  • JOIOI の塔 题解
    题目传送门洛谷上竟然还没有题解...题目分析简单贪心题。考虑倒过来寻找。显然,如果一个J想要配成一座塔,那么必须要找一个OI。O更简单,就是直接找到一个I放上去就......