今天看了一下矩阵树定理,然后学了一下\(O(n ^ 3)\)的方法求行列式。

哦对了,所有的证明我都没看……




这位大佬讲的好呀:

[学习笔记]高斯消元、行列式、Matrix-Tree 矩阵树定理




关于模数不是质数的情况,我看了半天才懂:其实就是加速了两行的辗转相减,把一次次减换成了取模。然后别忘了每一次交换两行的时候行列式要取相反数。




[HEOI2015]小Z的房间

这题就是板儿题了。把是'.'的格子记录下来,然后构造基尔霍夫矩阵就行了。

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
#define enter puts("")
#define space putchar(' ')
#define Mem(a, x) memset(a, x, sizeof(a))
#define In inline
typedef long long ll;
typedef double db;
const int INF = 0x3f3f3f3f;
const db eps = 1e-8;
const int maxn = 105;
const ll mod = 1e9;
inline ll read()
{
ll ans = 0;
char ch = getchar(), last = ' ';
while(!isdigit(ch)) last = ch, ch = getchar();
while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar();
if(last == '-') ans = -ans;
return ans;
}
inline void write(ll x)
{
if(x < 0) x = -x, putchar('-');
if(x >= 10) write(x / 10);
putchar(x % 10 + '0');
} int n, m, cnt = 0, id[maxn][maxn];
char s[maxn][maxn];
ll f[maxn][maxn]; In void add(int x, int y)
{
++f[x][x], ++f[y][y], --f[x][y], --f[y][x];
} In ll Gauss(int n)
{
ll ans = 1;
for(int i = 1; i <= n; ++i)
{
for(int j = i + 1; j <= n; ++j)
while(f[j][i])
{
ll d = f[i][i] / f[j][i];
for(int k = i; k <= n; ++k) f[i][k] = (f[i][k] - d * f[j][k] % mod + mod) % mod;
swap(f[i], f[j]), ans = -ans;
}
ans = (ans * f[i][i] % mod + mod) % mod;
}
return ans;
} int main()
{
n = read(), m = read();
for(int i = 1; i <= n; ++i) scanf("%s", s[i] + 1);
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j) if(s[i][j] == '.') id[i][j] = ++cnt;
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
if(id[i][j])
{
if(id[i][j + 1]) add(id[i][j], id[i][j + 1]);
if(id[i + 1][j]) add(id[i][j], id[i + 1][j]);
}
write(Gauss(cnt - 1)), enter;
return 0;
}



[[CQOI2018]社交网络](https://www.luogu.org/problemnew/show/P4455)
这题让求的是以节点1为根的生成树个数,于是我们把矩阵的第一行第一列消去,剩下的求一个行列式就是答案了。
注意连边是反的。
```c++
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define enter puts("")
#define space putchar(' ')
#define Mem(a, x) memset(a, x, sizeof(a))
#define In inline
typedef long long ll;
typedef double db;
const int INF = 0x3f3f3f3f;
const db eps = 1e-8;
const int maxn = 255;
const ll mod = 1e4 + 7;
inline ll read()
{
ll ans = 0;
char ch = getchar(), last = ' ';
while(!isdigit(ch)) last = ch, ch = getchar();
while(isdigit(ch)) ans = (ans = 10) write(x / 10);
putchar(x % 10 + '0');
}

int n, m;

ll f[maxn][maxn];

In ll quickpow(ll a, ll b)

{

ll ret = 1;

for(; b; b >>= 1, a = a * a % mod)

if(b & 1) ret = ret * a % mod;

return ret;

}

In ll Gauss()

{

ll ans = 1;

for(int i = 2; i <= n; ++i)

{

int pos = i;

while(!f[pos][i]) ++pos;

if(pos ^ i) swap(f[i], f[pos]), ans = mod - ans;

if(!f[i][i]) return 0; //如果每一行第i个数都输0,才返回0

ans = ans * f[i][i] % mod;

ll inv = quickpow(f[i][i], mod - 2);

for(int j = i + 1; j <= n; ++j)

{

ll tp = f[j][i] * inv % mod;

for(int k = i; k <= n; ++k) f[j][k] = (f[j][k] - tp * f[i][k] % mod + mod) % mod;

}

}

return ans;

}

int main()

{

n = read(), m = read();

for(int i = 1; i <= m; ++i)

{

int y = read(), x = read(); //x -> y

++f[y][y], --f[y][x];

}

write(Gauss()), enter;

return 0;

}

[HEOI2015]小Z的房间 && [CQOI2018]社交网络的更多相关文章

  1. bzoj 4031: [HEOI2015]小Z的房间 轮廓线dp

    4031: [HEOI2015]小Z的房间 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 98  Solved: 29[Submit][Status] ...

  2. 【bzoj4031】[HEOI2015]小Z的房间 解题报告

    [bzoj4031][HEOI2015]小Z的房间 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含\(n*m\)个格子的格状矩形,每个格子是一个房 ...

  3. 【BZOJ 4031】 4031: [HEOI2015]小Z的房间 (Matrix-Tree Theorem)

    4031: [HEOI2015]小Z的房间 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1089  Solved: 533 Description ...

  4. BZOJ 4031: [HEOI2015]小Z的房间 高斯消元 MartixTree定理 辗转相除法

    4031: [HEOI2015]小Z的房间 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4031 Description 你突然有了一个 ...

  5. 【bzoj4031】[HEOI2015]小Z的房间 Matrix-Tree定理+高斯消元

    [bzoj4031][HEOI2015]小Z的房间 2015年4月30日3,0302 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的 ...

  6. 【bzoj4031】[HEOI2015]小Z的房间 && 【bzoj4894】天赋 (矩阵树定理)

    来两道矩阵树模板: T1:[bzoj4031][HEOI2015]小Z的房间 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形 ...

  7. 【刷题】BZOJ 4031 [HEOI2015]小Z的房间

    Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子.在一开始的时候,相邻的格子之间都有墙隔着. ...

  8. P4111 [HEOI2015]小Z的房间 生成树计数

    这个题是生成树计数的裸题,中间构造基尔霍夫矩阵,然后构成行列式,再用高斯消元就行了.这里高斯消元有一些区别,交换两行行列式的值变号,且消元只能将一行的数 * k 之后加到别的行上. 剩下就没啥了... ...

  9. bzoj4031 [HEOI2015]小Z的房间

    Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子.在一开始的时候,相邻的格子之间都有墙隔着. ...

随机推荐

  1. 7个拒绝使用TypeScript的借口

    译者按: TypeScript 学习成本不高,项目切换成本不低,不过还是值得试一试的! 原文:7 bad excuses for not using TypeScript 译者: Fundebug 为 ...

  2. Arcgis去除Z,M值

    在arcgis中,我们常用的数据类型有点,线,面数据,但是有时候我们在转换数据的时候经常会带有ZM值,而带ZM值的数据在有些软件中是不会显示的,也就是说显示存在问题,所以我们需要去除掉ZM值 在arc ...

  3. Android 弹性布局 FlexboxLayout了解一下

    原文链接:https://mp.weixin.qq.com/s/Mi3cK7xujmEMI_rc51-r4g RelativeLayout.LinearLayout等常用布局相信大家早已耳熟能详,今天 ...

  4. tsung HTTP协议统计报告分析

    tsung HTTP协议统计报告分析 by:授客 QQ:1033553122 1.   Main Static l  higest 10sec mean: 基于每10s的统计,最大耗时 l  lowe ...

  5. 使用Java实现简单的局域网设备扫描

    在产品的使用中我们一般都要设置一个配置环节,这个环节可以设定主机的IP地址等信息,但是这样配置的话使得我们的产品用起来效果不是很好,因此我想到了实现局域网IP扫描的功能,IP局域网扫描是指定IP网段获 ...

  6. 杨学明老师推出全新课程--《敏捷开发&IPD和敏捷开发结合的实践》

    课时:13小时(2天) 敏捷开发&IPD和敏捷开发结合的实践 讲  师:杨学明 [课程背景] 集成产品开发(IPD).集成能力成熟度模型(CMMI).敏捷开发(Agile Developmen ...

  7. CentOS基本的命令与快捷建

    由于我的计算机在安装linux系统时,计算机出现了问题,并没有安装ubuntu而是安装的centos.虽然两者属于linux的不同版本,但是在具体的操作上大同小异.在学习linux的各种指令和快捷键的 ...

  8. MySQL 查看用户授予的权限

      在MySQL中,如何查看一个用户被授予了那些权限呢? 授予用户的权限可能分全局层级权限.数据库层级权限.表层级别权限.列层级别权限.子程序层级权限.具体分类如下: 全局层级 全局权限适用于一个给定 ...

  9. QQ空间、新浪微博、腾讯微博等一键分享API链接代码

    1.新浪微博:http://service.weibo.com/share/share.php?url= count=表示是否显示当前页面被分享数量(1显示)(可选,允许为空)&url=将页面 ...

  10. sql语句中的join用法(可视化解释)

    一.innerjoin innerjoin总结来说就是 ,如A知道通往B如何走:B知道通往C如何走:但是A不知道通往C如何走,但是A可以通过B获得去往C的通往方式.. 首先,假设有A,B两张表,结构及 ...