题目链接:

http://www.lydsy.com/JudgeOnline/problem.php?id=4031

题解:

Matrix-tree定理解决生成树计数问题,其中用到高斯消元法求上三角矩阵,其中消元用的是辗转相除法。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std; const int mod = 1e9;
const int maxn = ;
typedef long long LL; int n, m, tot;
char str[maxn][maxn];
int mp[maxn][maxn];
LL C[maxn][maxn];
const int dx[] = { ,,-, };
const int dy[] = { -,,, }; LL Det(int n) {
LL ret = ;
int f = ;
for (int i = ; i <= n; i++) {
for (int j = ; j <= n; j++) {
C[i][j] = (C[i][j] % mod + mod) % mod;
}
}
for (int i = ; i <= n; i++) {
for (int j = i + ; j <= n; j++) {
int A = C[i][i], B = C[j][i];
while (B!=) {
LL t = A / B; A = A%B; swap(A, B);
for (int k = i; k <= n; k++) {
C[i][k] = (C[i][k] - t*C[j][k] % mod + mod) % mod;
}
for (int k = i; k <= n;k++) {
swap(C[i][k], C[j][k]);
}
f = -f;
}
}
ret = ret*C[i][i] % mod;
}
if (f == -) ret = ((-ret)%mod + mod) % mod;
return ret;
} void init() {
tot = ;
memset(C, , sizeof(C));
} int main() {
while (scanf("%d%d", &n, &m) == && n) {
init();
for (int i = ; i < n; i++) scanf("%s", str[i]);
for (int i = ; i < n; i++) {
for (int j = ; j < m; j++) {
if (str[i][j] == '.') {
mp[i][j] = ++tot;
}
}
}
for (int i = ; i < n; i++) {
for (int j = ; j < m; j++) {
if (str[i][j] == '.') {
for (int t = ; t < ; t++) {
int ii = i + dx[t], jj = j + dy[t];
if (ii < || ii >= n || jj < || jj >= m || str[ii][jj] == '*') continue;
C[mp[i][j]][mp[i][j]]++;
C[mp[i][j]][mp[ii][jj]]--;
}
}
}
}
LL ans=Det(tot - );
printf("%lld\n", ans);
}
return ;
}

BZOJ 4031: [HEOI2015]小Z的房间 Matrix-Tree定理的更多相关文章

  1. BZOJ.4031.[HEOI2015]小Z的房间(Matrix Tree定理 辗转相除)

    题目链接 辗转相除解行列式的具体实现? 行列式的基本性质. //864kb 64ms //裸的Matrix Tree定理.练习一下用辗转相除解行列式.(因为模数不是质数,所以不能直接乘逆元来高斯消元. ...

  2. BZOJ 4031: [HEOI2015]小Z的房间(Matrix Tree)

    传送门 解题思路 矩阵树定理模板题.矩阵树定理是求图中最小生成树个数,做法是首先求出基尔霍夫矩阵,就是度数矩阵\(-\)邻接矩阵.然后再求出这个矩阵的行列式,行列式的求法就是任意去掉一行一列,然后高斯 ...

  3. BZOJ 4031 [HEOI2015]小Z的房间(Matrix-Tree定理)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4031 [题目大意] 你突然有了一个大房子,房子里面有一些房间. 事实上,你的房子可以看 ...

  4. BZOJ 4031: [HEOI2015]小Z的房间 [矩阵树定理 行列式取模]

    http://www.lydsy.com/JudgeOnline/problem.php?id=4031 裸题........ 问题在于模数是$10^9$ 我们发现消元的目的是让一个地方为0 辗转相除 ...

  5. BZOJ 4031: [HEOI2015]小Z的房间 (矩阵树定理 板题)

    背结论 : 度-邻 CODE1 O(n3logn)O(n^3logn)O(n3logn) #include <bits/stdc++.h> using namespace std; typ ...

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

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

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

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

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

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

  9. BZOJ 4031 HEOI2015 小Z的房间 基尔霍夫矩阵+行列式+高斯消元 (附带行列式小结)

    原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4031 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可 ...

随机推荐

  1. ruby(html)

    有的时候,我们要给汉字标记拼音,让拼音显示要汉字的上面 <ruby>中国人<rp>(</rp><rt>zhong guo ren</rt>& ...

  2. 理解C#系列 / 核心C# / 名称空间

    名称空间namespace 名称空间 名称空间用来逻辑分类,而不是物理上的,名称空间与程序集无关[程序集:经由编译器编译得到的文件],同一个程序集中可以有2不同的名称空间,也可以在不同的程序集中定义同 ...

  3. Linux 线程 条件变量

    一:条件变量 直接上最基本的两个函数,先抓主要矛盾: //等待条件 int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex ...

  4. C语言成绩测试 ,水仙花数,打印星图

    #include <stdio.h>//输入输出头文件 #include<string.h> #include<stdlib.h> //局部被调用函数1 成绩检测 ...

  5. android SDK启动的错误

    1. AVD Manager.exe : failed to execute tools android.bat 请把AVD Manager.exe复制到跟 SDK Manager.exe的相同目录下 ...

  6. 《boot分区监控的小脚本》

    #!/bin/bash TEST=`df | grep "boot" |awk '{print $5}' |cut -f1 -d"%"` if [ $TEST ...

  7. 《APUE》第四章笔记(4)

    这算是在博客园写的第一篇文章啊,之前都在csdn写(虽然才写了几篇,因为开通也没多少天..),还是稍微期待下吧.我写博客的主要意图是一来能够记录下来自己所学过的东西,二来也想能够跟大家交流,能够得到更 ...

  8. 《Java核心技术与最佳实践》读书笔记

    第一章 Java7新语法 1.switch中使用字符串 2.增加二进制表示0b10101010:数字字面量允许直径使用下划线12_34_90 3.一个catch字句捕获多个异常,多个异常之间用|分隔 ...

  9. 51nod1270 数组的最大代价(简单dp)

    ---恢复内容开始--- 1270 数组的最大代价 题目来源: HackerRank 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 数组A包含N个 ...

  10. PHP实现链式操作的原理

    在一个类中有多个方法,当你实例化这个类,并调用方法时只能一个一个调用,类似: db.php <?php class db{ public function where() { //code he ...