[BZOJ5133][CodePlus2017年12月]白金元首与独舞
题意
给你一个\(n*m\)的网格,每个位置上有一个箭头指向上或下或左或右。有些位置上还没有箭头,现在要求你在这些没有箭头的位置上填入箭头,使得从网格的任意一个位置开始,都可以沿着箭头走出网格。
求填入的方案数膜\(10^9+7\)
sol
给“网格外”建一个点。每个格子向它指向的格子连一条边。
这样会发现一个方案合法当且仅当连出的这\(n*m\)条边构成一棵树。
没有确定的格子可以向四个方向连边。这样直接上矩阵树可以做到\(O((nm)^3)\)。
考虑优化。只对所有未确定的格子以及“网格外”建点,这样就只有\(k+1\)个点。每个未确定的格子向四个方向能走到的第一个未确定格子或是“网格外”连边。
具体实现可以用记搜,同时记录一下每个状态是否在搜索栈中,可以判无解。
复杂度是\(O(nm+k^3)\)
code
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 305;
const int mod = 1e9+7;
int T,n,m,tot,id[N][N],f[N][N],vis[N][N],fg,a[N][N],ans;char s[N][N];
void init()
{
tot=fg=ans=1;
memset(id,0,sizeof(id));
memset(f,-1,sizeof(f));
memset(vis,0,sizeof(vis));
memset(a,0,sizeof(a));
}
int dfs(int i,int j)
{
if (~f[i][j]) return f[i][j];
if (i<1||i>n||j<1||j>m) return 1;
if (id[i][j]) return f[i][j]=id[i][j];
if (vis[i][j]) return f[i][j]=fg=0;vis[i][j]=1;
if (s[i][j]=='L') f[i][j]=dfs(i,j-1);
if (s[i][j]=='R') f[i][j]=dfs(i,j+1);
if (s[i][j]=='U') f[i][j]=dfs(i-1,j);
if (s[i][j]=='D') f[i][j]=dfs(i+1,j);
vis[i][j]=0;return f[i][j];
}
void link(int u,int v){a[u][v]--;a[v][v]++;}
int main()
{
freopen("dancestep.in","r",stdin);
freopen("dancestep.out","w",stdout);
scanf("%d",&T);
while (T--)
{
scanf("%d%d",&n,&m);init();
for (int i=1;i<=n;++i)
{
scanf("%s",s[i]+1);
for (int j=1;j<=m;++j)
if (s[i][j]=='.') id[i][j]=++tot;
}
for (int i=1;i<=n;++i)
for (int j=1;j<=m;++j)
dfs(i,j);
for (int i=1;i<=n;++i)
for (int j=1;j<=m;++j)
if (id[i][j])
{
link(dfs(i,j-1),id[i][j]);link(dfs(i,j+1),id[i][j]);
link(dfs(i-1,j),id[i][j]);link(dfs(i+1,j),id[i][j]);
}
if (!fg) {puts("0");continue;}
for (int i=1;i<=tot;++i)
for (int j=1;j<=tot;++j)
a[i][j]=(a[i][j]+mod)%mod;
for (int i=2;i<=tot;++i)
{
for (int j=i+1;j<=tot;++j)
while (a[j][i])
{
int t=a[i][i]/a[j][i];
for (int k=i;k<=tot;++k) a[i][k]=(a[i][k]-1ll*t*a[j][k]%mod+mod)%mod,swap(a[i][k],a[j][k]);
ans=(mod-ans)%mod;
}
ans=1ll*ans*a[i][i]%mod;
}
printf("%d\n",ans);
}
}
[BZOJ5133][CodePlus2017年12月]白金元首与独舞的更多相关文章
- 【BZOJ5133】[CodePlus2017年12月]白金元首与独舞 矩阵树定理
[BZOJ5133][CodePlus2017年12月]白金元首与独舞 题面:www.lydsy.com/JudgeOnline/upload/201712/div1.pdf 题解:由于k很小,考虑用 ...
- 【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\) 格可以任意指定走出方 ...
随机推荐
- Mybatis之基础应用小结以及IntelliJ IDEA目录结构的一些小问题
IntelliJ IDEA 目录结构的一些小问题 [Mybatis 之基础应用小结] 1.不管怎么样,先建立一个简单的MySQL数据表,如下所示 2.接下来要做的事情就是通过Mybatis对数据表进行 ...
- Sybase:存储过程中采用临时表存储统计数据
Sybase:存储过程中采用临时表存储统计数据 作用 很有效的提升统计查询速度,对于数据量亿级.千万级多表之间关联查询,非常有效: 使用 --无需定义临时表,直接使用 --自动释放临时表 select ...
- 20145201《Java程序设计》第五次实验报告
实验五 Java网络编程及安全 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 我负责客户端 组队队员:鄢曼君20145227负责服务器 博客地址:htt ...
- mysql 5.6 设置root初始密码正确步骤,避免入坑
http://blog.csdn.net/lw_power/article/details/47368167
- react-native run-android Starting: Intent Error type 3 Error: Activity class does not exist
使用”react-native run-android”命令运行android应用时,如果常常出现如下错误: Starting the app (/home/xxx/soft/sdk//platfor ...
- 进程管理工具supervisor
1. 简介 supervisor有两个组件:supervisord和supervisorctl,组成了client/server结构. supervisord负责读入配置文件,然后supervisor ...
- Merge k Sorted Lists, k路归并
import java.util.Arrays; import java.util.List; import java.util.PriorityQueue; /* class ListNode { ...
- java中的Properties
Properties类继承自HashTable类并实现了Map接口,也是使用一种键值对的形式来保存属性集.不过Properties有特殊的地方,就是它的键和值都是字符串类型. Properties中的 ...
- Button之常用事件
Button之常用事件 一.简介 1.button介绍 本文介绍了Buttonn的点击事件,触摸事件,获得焦点事件 接口分别为:OnClickListener,OnTouchListener,OnFo ...
- appium自动化测试(五)
1. 页面封装——理性判断 2. basepage——定位表达式的判断——要加上移动端的,加上上下左右滑动封装.toast可以封装.webview切换操作 3. 页面当中,所有元素定位——更换——移动 ...