[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\) 格可以任意指定走出方 ...
随机推荐
- JSR规范整理
Web Service技术 Java Date与Time API ( JSR 310) Java API for RESTful Web Services (JAX-RS) 1.1 (JSR 311) ...
- 【北京集训D2T3】tvt
[北京集训D2T3]tvt \(n,q \le 1e9\) 题目分析: 首先需要对两条路径求交,对给出的四个点的6个lca进行分类讨论.易于发现路径的交就是这六个lca里面最深的两个所形成的链. 然后 ...
- 判断iframe页面是否是顶层页面
if (self!=top) { window.parent.location.reload();}
- 标记语言XML
标记语言概述 标记语言,是一种将文本(Text)以及文本相关的其他信息结合起来,展现出关于文档结构和数据处理细节的电脑文字编码.一部分是标记,一部分是标记中的内容,两部分构成标记语言 <标记 ...
- BI项目中的ETL设计详解(数据抽取、清洗与转换 )(转载)
原文:http://www.cnblogs.com/reportmis/p/5939732.html ETL是BI项目最重要的一个环节,通常情况下ETL会花掉整个项目的1/3的时间,ETL设计的好坏直 ...
- jQ&js给label
<strong>当前角色:</strong><label id="lblRoleName" style="margin-bottom: 0p ...
- Treflection01_Class对象_构造函数_创建对象
1. package reflectionZ; import java.lang.reflect.Constructor; import java.util.List; public class Tr ...
- SDWebImage支持URL不变时更新图片内容
SDWebImage在iOS项目中是一个很常用的开源库,而且众所周知的是,它是基于URL作为Key来实现图片缓存机制的.在90%左右的情况下, 图片与URL是一一对应的,即使服务器修改了图片也会相应的 ...
- CPU Usage (C#) 测试
注意:算法仅供参考. cpuusage.cs using System; using System.Collections.Generic; using System.Diagnostics; usi ...
- java 数据库索引的注意事项
索引缺点 1.虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行insert.update和delete.因为更新表时,不仅要保存数据,还要保存一下索引文件.2.建立索引会占用磁盘空间的 ...