bzoj4031 [HEOI2015]小Z的房间
来源:互联网 发布:手机怎么下载不了淘宝 编辑:程序博客网 时间:2024/05/03 15:58
【题意】
给定一个n*m的网格图,其中有一些坏点。求不包含坏点的生成树个数,答案对10^9取模。
【数据范围】
n<=9,m<=9
【思路】
本题有两种方法:
[方法一]matrix-tree定理
kirchhoff矩阵=度数矩阵-邻接矩阵
n阶矩阵的任意一个(n-1)阶主子式=这个矩阵去掉第i行第i列,i任意
matrix-tree定理:生成树个数=kirchhoff矩阵任意一个(n-1)阶主子式行列式的绝对值
求解矩阵行列式:
行列式的2个性质:
1.将矩阵任意一行的数值*k加到矩阵另一行上,矩阵行列式的值不变,列同理
2.交换两行,行列式取相反数,列同理
故我们采用类似高斯消元的方法:
对于每一列的元素,根据上面2个性质进行“消元”,将这一列上除当前第一个数外的其余所有数均消成0,然后矩阵规模-1,循环直到矩阵规模为1*1即可
故求解n*n矩阵的行列式,时间复杂度为O(n^3)
本题由于模数不是质数,故使用辗转相除进行消元
[方法二]插头dp
本题不同于一般的插头dp,由于求解生成树个数,故状态表示对应格点的连通性,使用最小表示法记录状态
【时间复杂度】
[方法一]O(n^6)
[方法二]O(状态数*n^2)
【方法一】
//matrix-tree定理+辗转相除消元 #include<cstdio>#include<cstring>#include<algorithm>#define N 90#define mod 1000000000#define ll long longusing namespace std; const int dx[4]={-1, 0, 0, 1};const int dy[4]={0, -1, 1, 0};int n, m, now, pos[N][N], a[N][N], x, y;char S[20]; int get_hls(int n){ for(int i=1; i<=n; i++) for(int j=1; j<=n; j++)a[i][j]=(a[i][j]+mod)%mod; int ans=1, ff=1, A, B, t; for(int i=1; i<=n; i++){ for(int j=i+1; j<=n; j++){ A=a[i][i]; B=a[j][i]; while(B){ t=A/B; A=A%B; swap(A, B); for(int k=i; k<=n; k++)a[i][k]=(a[i][k]-(ll)t*a[j][k]%mod+mod)%mod; for(int k=i; k<=n; k++)swap(a[i][k], a[j][k]); ff^=1; } } if(!a[i][i])return 0; ans=(ll)ans*a[i][i]%mod; } if(!ff)return (mod-ans)%mod; else return ans;} int main(){ scanf("%d%d", &n, &m); now=0; memset(pos, 0, sizeof(pos)); for(int i=1; i<=n; i++){ scanf("%s", S+1); for(int j=1; j<=m; j++) if(S[j]=='.')pos[i][j]=++now; } memset(a, 0, sizeof(a)); for(int i=1; i<=n; i++) for(int j=1; j<=m; j++)if(pos[i][j]){ for(int k=0; k<=3; k++){ x=i+dx[k]; y=j+dy[k]; if(x>=1&&x<=n&&y>=1&&y<=m&&pos[x][y]){ a[pos[i][j]][pos[i][j]]++; a[pos[i][j]][pos[x][y]]--; } } } printf("%d", get_hls(now-1)); return 0;}
0 0
- 【HEOI2015】【BZOJ4031】小Z的房间
- bzoj4031【HEOI2015】小Z的房间
- bzoj4031 [HEOI2015]小Z的房间
- 【HEOI2015】bzoj4031 小z的房间
- BZOJ4031: [HEOI2015]小Z的房间
- bzoj4031: [HEOI2015]小Z的房间
- 【bzoj4031】 HEOI2015小Z的房间 矩阵树定理
- [BZOJ4031][HEOI2015]小Z的房间(矩阵树定理+高斯消元)
- BZOJ 4031: [HEOI2015]小Z的房间
- 4031: [HEOI2015]小Z的房间
- BZOJ4031——HEOI小z的房间
- BZOJ 4031 HEOI2015 小Z的房间 Matrix-Tree定理
- 【BZOJ 4031】[HEOI2015]小Z的房间 基尔霍夫矩阵
- bzoj 4031: [HEOI2015]小Z的房间 矩阵树定理
- BZOJ 4031: [HEOI2015]小Z的房间 矩阵树定理
- bzoj 4031: [HEOI2015]小Z的房间 (矩阵树定理+高斯消元)
- BZOJ 4031([HEOI2015]小Z的房间-矩阵树定理+辗转相除)
- BZOJ 4031: [HEOI2015]小Z的房间 Matrix-Tree定理+辗转相除法求行列式的值(高斯消元)
- 手把手教你Photoshop中的图层混合模式(二)
- jQuery.parseJSON()函数
- 【C++】 C++标准模板库(四) Set
- 在Linux上运行procmem和procrank
- Python爬取SDUTOJ比赛提交代码及批量提交(爬虫(伪))
- bzoj4031 [HEOI2015]小Z的房间
- iOS 与 位移枚举
- String和StringBuffer、StringBuilder的区别
- 【qt】gps转百度地图坐标
- 关于变量a的定义
- 如何把一段逗号分割的字符串转换成一个数组
- Hibernate复合主键映射
- RHEL6.4安装CentOS的yum
- 手把手教你使用Photoshop中的通道