【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\) 格可以任意指定走出方 ...
随机推荐
- 【NLP】Stanford
http://web.stanford.edu/class/cs224n/syllabus.html https://www.youtube.com/watch?v=OQQ-W_63UgQ&l ...
- go的精选类库
https://github.com/avelino/awesome-go https://gitee.com/snail/proxy
- jquery组件WebUploader文件上传用法详解
这篇文章主要为大家详细介绍了jquery组件WebUploader文件上传用法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 WebUploader是由Baidu WebFE(FEX)团队开发的一 ...
- ubuntu 13.04 nginx.conf 配置详解
1.nginx.conf 文件,路径为:/etc/nginx/agin.conf #使用的用户和组 user www-data; #指定工作衍生进程数(一般等于CPU总核数或总核数的两倍) worke ...
- Redis 集群配置
Redis 集群介绍: (1) 为什么要使用集群:如果数据量很大,单台机器会存在存储空间不够用 .查询速度慢 .负载高等问题,部署集群就是为了解决这些问题(2) Redis 集群架构如下,采用无中心结 ...
- 解决“Connection to https://dl-ssl.google.com refused”问题
相信一些人刚开始搞android的安装开发环境的时候会遇到:Failed to fectch URl https://dl-ssl.google.com/android/repository/addo ...
- [Command] lrzsz - 文件传输工具包
lrzsz 是一个支持 XMODEM.YMODEM.ZMODEM 文件传输协议的 Unix 程序包.它是 Omen Technologies 公司所有的 rzsz 程序包的公开发行增强版,遵守 GNU ...
- C语言结构体和指针
指针也可以指向一个结构体,定义的形式一般为: struct 结构体名 *变量名; 下面是一个定义结构体指针的实例: struct stu{ char *name; //姓名 int num; //学号 ...
- fastcgi模式下设置php最大执行时间
php在执行中常见错误: The FastCGI process exceeded configured request timeout: FastCGI process exceeded confi ...
- Swift - 构造函数
Swift 2.0 构造函数基础 构造函数是一种特殊的函数,主要用来在创建对象时初始化对象,为对象成员变量设置初始值,在 OC 中的构造函数是 initWithXXX,在 Swift 中由于支持函数重 ...