【BZOJ5133】[CodePlus2017年12月]白金元首与独舞 矩阵树定理
【BZOJ5133】[CodePlus2017年12月]白金元首与独舞
题面:www.lydsy.com/JudgeOnline/upload/201712/div1.pdf
题解:由于k很小,考虑用矩阵树定理。
我们先预处理出:从每个已决策点,一直走下去会走到哪个未决策点(我们将最外面看作一个大的未决策点)。可以用拓扑排序搞定,若有环则无解。
然后我们枚举每个未决策点的四个方向,看一下一直走下去会走到哪个点,在新图中从这个点到终点连一条边。得到新图的出度矩阵和邻接矩阵,求出|出度矩阵-邻接矩阵|即可。
注:内向树:出度矩阵,外向树:入度矩阵。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#define p(A,B) (((A)-1)*m+(B))
using namespace std;
typedef long long ll;
const ll P=1000000007; int T,n,m,tot,cnt;
ll ans;
int x[310],y[310],from[40010],to[40010],next[40010],head[40010];
ll v[310][310];
char str[210][210];
queue<int> q;
inline void add(int a,int b)
{
to[cnt]=b,next[cnt]=head[a],head[a]=cnt++;
}
void work()
{
scanf("%d%d",&n,&m);
int i,j,k,a,b,u;
memset(from,-1,sizeof(from)),memset(head,-1,sizeof(head)),cnt=tot=0;
q.push(0),from[0]=0;
for(i=1;i<=n;i++)
{
scanf("%s",str[i]+1);
for(j=1;j<=m;j++)
{
if(str[i][j]=='.') x[++tot]=i,y[tot]=j,q.push(p(i,j)),from[p(i,j)]=tot;
else
{
a=i,b=j;
if(str[i][j]=='L') b--;
if(str[i][j]=='R') b++;
if(str[i][j]=='U') a--;
if(str[i][j]=='D') a++;
if(!a||!b||a>n||b>m) add(0,p(i,j));
else add(p(a,b),p(i,j));
}
}
}
while(!q.empty())
{
u=q.front(),q.pop();
for(i=head[u];i!=-1;i=next[i]) from[to[i]]=from[u],q.push(to[i]);
}
for(i=1;i<=n*m;i++) if(from[i]==-1)
{
puts("0");
return ;
}
memset(v,0,sizeof(v));
for(i=1;i<=tot;i++)
{
a=x[i],b=y[i];
if(a<n) v[i][from[p(a+1,b)]]--;
if(a>1) v[i][from[p(a-1,b)]]--;
if(b<m) v[i][from[p(a,b+1)]]--;
if(b>1) v[i][from[p(a,b-1)]]--;
v[i][i]+=4;
}
for(i=1;i<=tot;i++) for(j=1;j<=tot;j++) if(v[i][j]<0) v[i][j]+=P;
for(ans=1,i=1;i<=tot;i++)
{
for(j=i;j<=tot;j++) if(v[j][i]) break;
if(j!=i) for(ans=P-ans,k=i;k<=tot;k++) swap(v[i][k],v[j][k]);
for(j=i+1;j<=tot;j++)
{
ll A=v[i][i],B=v[j][i],tmp,temp;
while(B)
{
tmp=A/B,temp=A,A=B,B=temp%B;
for(ans=P-ans,k=i;k<=tot;k++) v[i][k]=(v[i][k]-tmp*v[j][k]%P+P)%P,swap(v[i][k],v[j][k]);
}
}
ans=ans*v[i][i]%P;
}
printf("%lld\n",ans);
}
int main()
{
//freopen("C.in","r",stdin);
scanf("%d",&T);
while(T--) work();
return 0;
}
【BZOJ5133】[CodePlus2017年12月]白金元首与独舞 矩阵树定理的更多相关文章
- [BZOJ5133][CodePlus2017年12月]白金元首与独舞
bzoj luogu 题意 给你一个\(n*m\)的网格,每个位置上有一个箭头指向上或下或左或右.有些位置上还没有箭头,现在要求你在这些没有箭头的位置上填入箭头,使得从网格的任意一个位置开始,都可以沿 ...
- 【bzoj5133】[CodePlus2017年12月]白金元首与独舞 并查集+矩阵树定理
题目描述 给定一个 $n\times m$ 的方格图,每个格子有 ↑.↓.←.→,表示从该格子能够走到相邻的哪个格子.有一些格子是空着的,需要填上四者之一,需要满足:最终的方格图中,从任意一个位置出发 ...
- [LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞
[LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞 试题描述 到河北省 见斯大林 / 在月光下 你的背影 / 让我们一起跳舞吧 うそだよ~ 河北省怎么可能有 Stalin. ...
- BZOJ5131: [CodePlus2017年12月]可做题2
BZOJ没有题面,差评 洛谷的题目链接 题解 其实这题很久之前就写了,也想写个题解但是太懒了,咕到了今天 在typora写完题解不想copy过来再改格式了,于是直接贴截图qwq #include &l ...
- 【LibreOJ】#6259. 「CodePlus 2017 12 月赛」白金元首与独舞
[题目]给定n行m列的矩阵,每个位置有一个指示方向(上下左右)或没有指示方向(任意选择),要求给未定格(没有指示方向的位置)确定方向,使得从任意一个开始走都可以都出矩阵,求方案数.n,m<=20 ...
- 「CodePlus 2017 12 月赛」白金元首与独舞
description 题面 data range \[ 1 \leq T \leq 10, 1 \leq n, m \leq 200 , 0 \leq k \leq \min(nm, 300)\] ...
- 走进矩阵树定理--「CodePlus 2017 12 月赛」白金元首与独舞
n,m<=200,n*m的方阵,有ULRD表示在这个格子时下一步要走到哪里,有一些待决策的格子用.表示,可以填ULRD任意一个,问有多少种填法使得从每个格子出发都能走出这个方阵,答案取模.保证未 ...
- loj6259「CodePlus 2017 12 月赛」白金元首与独舞
分析 我们将没连的点连向周围四个点 其余的按照给定的方向连 我们将所有连出去的位置统一连到0点上 再以0作为树根 于是就将问题转化为了有向图内向树计数 代码 #include<iostream& ...
- Solution -「Code+#2」「洛谷 P4033」白金元首与独舞
\(\mathcal{Description}\) link. 给定一个 \(n\times m\) 的网格图,一些格子指定了走出该格的方向(上下左右),而有 \(k\) 格可以任意指定走出方 ...
随机推荐
- [转]jmeter 自定义测试脚本
http://blog.csdn.net/kash_chen007/article/details/37690411 http://wangym.iteye.com/blog/731729 1.创建一 ...
- ubuntu下安装程序的五种方法
在ubuntu当中,安装应用程序我所知道的有三种方法,分别是apt-get,dpkg安装deb和make install安装源码包三种.下面针对每一种方法各举例来说明. 一.apt-get方法 使用a ...
- js合并.css合并工具
http://www.neoease.com/css-javascript-combo-tool/ http://www.neoease.com/minimize-javascript-files-u ...
- AngularJS------报错"The selector "app-user-item" did not match any elements"
原因:新建的组件没有在任何界面使用到 解决方法:在界面使用该组件
- Dubbo -- 系统学习 笔记 -- 示例 -- 负载均衡
Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 负载均衡 在集群负载均衡时,Dubbo提供了多种均衡策略,缺省为random随机调 ...
- eclipse 安装 ndk 组件
新安装的eclipse没有ndk组件, 我使用的安装包是:android-ndk32-r10b-windows-x86_64.zip,打开preferences如下
- 转载用sql语句计算出mysql数据库的qps,tps,iops性能指标
本帖最后由 LUK 于 2014-9-21 22:39 编辑 思路: 1 关注MYSQL三个方面的性能指标,分别为query数,transaction数,io请求数 2 在某个时间范围内(例如20秒) ...
- Django SimpleCMDB API
编写一个API,当我们访问 http://192.168.216.128:8000/hostinfo/getjson 时,返回 json 格式的主机组和组成员信息: [root@localhost S ...
- 顶点纹理shader
Shader "Custom/VertDisplace" { Properties { _MainTex ("Base (RGB)", 2D) = " ...
- 保存对象时碰到的问题-列名 'Discriminator' 无效
今天保存对象时碰到问题: {"列名 'Discriminator' 无效.\r\n列名 'Discriminator' 无效."} 百度了一下,百度找到的一个解决: http:/ ...