【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月]白金元首与独舞 矩阵树定理的更多相关文章

  1. [BZOJ5133][CodePlus2017年12月]白金元首与独舞

    bzoj luogu 题意 给你一个\(n*m\)的网格,每个位置上有一个箭头指向上或下或左或右.有些位置上还没有箭头,现在要求你在这些没有箭头的位置上填入箭头,使得从网格的任意一个位置开始,都可以沿 ...

  2. 【bzoj5133】[CodePlus2017年12月]白金元首与独舞 并查集+矩阵树定理

    题目描述 给定一个 $n\times m$ 的方格图,每个格子有 ↑.↓.←.→,表示从该格子能够走到相邻的哪个格子.有一些格子是空着的,需要填上四者之一,需要满足:最终的方格图中,从任意一个位置出发 ...

  3. [LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞

    [LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞 试题描述 到河北省 见斯大林 / 在月光下 你的背影 / 让我们一起跳舞吧 うそだよ~ 河北省怎么可能有 Stalin. ...

  4. BZOJ5131: [CodePlus2017年12月]可做题2

    BZOJ没有题面,差评 洛谷的题目链接 题解 其实这题很久之前就写了,也想写个题解但是太懒了,咕到了今天 在typora写完题解不想copy过来再改格式了,于是直接贴截图qwq #include &l ...

  5. 【LibreOJ】#6259. 「CodePlus 2017 12 月赛」白金元首与独舞

    [题目]给定n行m列的矩阵,每个位置有一个指示方向(上下左右)或没有指示方向(任意选择),要求给未定格(没有指示方向的位置)确定方向,使得从任意一个开始走都可以都出矩阵,求方案数.n,m<=20 ...

  6. 「CodePlus 2017 12 月赛」白金元首与独舞

    description 题面 data range \[ 1 \leq T \leq 10, 1 \leq n, m \leq 200 , 0 \leq k \leq \min(nm, 300)\] ...

  7. 走进矩阵树定理--「CodePlus 2017 12 月赛」白金元首与独舞

    n,m<=200,n*m的方阵,有ULRD表示在这个格子时下一步要走到哪里,有一些待决策的格子用.表示,可以填ULRD任意一个,问有多少种填法使得从每个格子出发都能走出这个方阵,答案取模.保证未 ...

  8. loj6259「CodePlus 2017 12 月赛」白金元首与独舞

    分析 我们将没连的点连向周围四个点 其余的按照给定的方向连 我们将所有连出去的位置统一连到0点上 再以0作为树根 于是就将问题转化为了有向图内向树计数 代码 #include<iostream& ...

  9. Solution -「Code+#2」「洛谷 P4033」白金元首与独舞

    \(\mathcal{Description}\)   link.   给定一个 \(n\times m\) 的网格图,一些格子指定了走出该格的方向(上下左右),而有 \(k\) 格可以任意指定走出方 ...

随机推荐

  1. .NET 获取Get方式URL中的参数键值

    在Web开发中,我们常常会涉及到需要获取Get方式URL中的参数键值的情况,这里简单介绍三种方法: 第一种:常用的做法有使用JavaScript获取location.href后用正则表达式匹配获取此U ...

  2. UITextField禁用掉编辑之后...

    某些UITextField只为了摆数据,还有响应点击,为了避免频繁出现键盘,所以把UITextField的人机交互(userInteractionEnabled)给关闭了 此时,给UITextFiel ...

  3. Lua点号和冒号区别

    定义的时候冒号默认接收self参数调用的时候冒号默认传递调用者自己为参数而句号要显示传递或接收self参数 -- 例如:句号定义,需要显示传递或接收 a = { x = } function a.fu ...

  4. jekins job configure找不到remote trigger(script)

    今天想测试一下,remote的方式启动一个job,但是在“构建触发器”一栏根本找不到remote trigger,很惊讶的是在网上所有的doc或者demo里都是有这个选项的. 最后,终于找到了原因: ...

  5. 使用pyinotify实现加强版的linux tail -f 命令,并且对日志类型的文本进行单独优化着色显示。

    tail -f命令不能自动切换切片文件,例如日志是每100M生成一个新文件,tail -f不能自动的切换文件,必须关闭然后重新运行tail -f 此篇使用pyinotify,检测文件更新,并实现tai ...

  6. 10 -- 深入使用Spring -- 5...2 在Spring中使用Quartz

    10.5.2 在Spring中使用Quartz Spring 的任务调度抽象层简化了任务调度,在Quartz基础上提供了更好的调度抽象.本系统使用Quartz框架来完成任务调度,创建Quartz的作业 ...

  7. webstrom 2017 安装及配置

    下载安装:http://www.jetbrains.com/webstorm/ 激活:安装完成后,在打开的 License Activation 窗口中选择 License server. 在输入框输 ...

  8. 安装centos6.5

    我是在虚拟机上面安装的centos6.5,本机的系统是windows 2008 datacenter. 到这个地方下载镜像文件:http://mirrors.sohu.com/centos/6.5/i ...

  9. linux下查看当前目录属于哪个分区?

    下班之前写哈今天用的一个新命令. df -h /opt/test

  10. Ansible常用模块使用

    Ansible官方提供了非常多的模块,还有若干第三方模块,我们也可以自己编写模块. Ansible对远程服务器的操作实际是通过模块完成的,先将模块拷贝到远程服务器,完成操作后,然后在远程服务器上删除该 ...