bzoj 1875: [SDOI2009]HH去散步 -- 矩阵乘法
1875: [SDOI2009]HH去散步
Time Limit: 20 Sec Memory Limit: 64 MB
Description
Input
Output
一行,表示答案。
Sample Input
0 1
0 2
0 3
2 1
3 2
Sample Output
HINT
一眼矩阵乘法,但是有一个问题,就是如何处理不能回头的问题
发现题解很巧妙的做法把边点互换,考虑从一条边能转移到哪些边,这样搞矩乘就好了
#include<map>
#include<cmath>
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
#define p 45989
#define N 130
inline int rd()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int lj[N],fro[N],to[N],cnt=,from[N];
void add(int a,int b){fro[++cnt]=lj[a];to[cnt]=b;lj[a]=cnt;from[cnt]=a;}
int n,m,K;
struct bwl{ll q[N][N];}a,b,ans;
bwl operator*(bwl k,bwl l)
{
int i,j,o;
bwl z;
memset(z.q,,sizeof(z.q));
for(i=;i<=cnt;i++)
for(j=;j<=cnt;j++)
for(o=;o<=cnt;o++)
z.q[i][j]=(z.q[i][j]+k.q[i][o]*l.q[o][j])%p;
return z;
}
int A,B;
int main()
{
n=rd();m=rd();K=rd()-;A=rd()+;B=rd()+;
int u,v;
for(int i=;i<=m;i++)
{
u=rd()+;v=rd()+;
add(u,v);add(v,u);
}
for(int i=lj[A];i;i=fro[i]) ans.q[][i]++;
for(int i=;i<=cnt;i++)
for(int j=;j<=cnt;j++)
if(to[i]==from[j])
if(i!=(j^)) a.q[i][j]++;
for(int i=;i<=cnt;i++) b.q[i][i]=;
while(K)
{
if(K&) b=a*b;
a=a*a;K>>=;
}
ans=ans*b;
int ji=;
for(int i=lj[B];i;i=fro[i]) ji+=ans.q[][i^];
printf("%d\n",ji%p);
return ;
}
bzoj 1875: [SDOI2009]HH去散步 -- 矩阵乘法的更多相关文章
- BZOJ 1875: [SDOI2009]HH去散步( dp + 矩阵快速幂 )
把双向边拆成2条单向边, 用边来转移...然后矩阵乘法+快速幂优化 ------------------------------------------------------------------ ...
- BZOJ 1875: [SDOI2009]HH去散步(矩阵乘法)
首先,题意就把我们引向了矩阵乘法,注意边长m<=60,那么就按边建图,变成一个120个点的图,然后乱搞就行了。 PS:WA了N久改了3次终于A了QAQ CODE: #include<cst ...
- bzoj 1875 [SDOI2009]HH去散步(矩乘)
Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又因 ...
- 【bzoj1875】[SDOI2009]HH去散步 矩阵乘法
题目描述 一张N个点M条边的无向图,从A走到B,要求:每一次不能立刻沿着上一次的边的反方向返回.求方案数. 输入 第一行:五个整数N,M,t,A,B. N表示学校里的路口的个数 M表示学校里的路的条数 ...
- BZOJ.1875.[SDOI2009]HH去散步(DP 矩阵乘法)
题目链接 比较容易想到用f[i][j]表示走了i步后到达j点的方案数,但是题目要求不能走上一条走过的边 如果这样表示是不好转移的 可以考虑边,f[i][j]表示走了i步后到达第j条边的方案数,那么有 ...
- BZOJ 1875 [SDOI2009]HH去散步 ——动态规划 矩阵乘法
发现t非常大,所以大概就是快速幂一类的问题了, 然后根据k^3logn算了算,发现k大约是边数的时候复杂度比较合适. 发现比较麻烦的就是前驱的记录,所以直接把边看做点,不能走反向边,但是可以走重边,然 ...
- 【BZOJ】1875: [SDOI2009]HH去散步 矩阵快速幂
[题意]给定n个点m边的无向图,求A到B恰好经过t条边的路径数,路径须满足每条边都和前一条边不同.n<=20,m<=60,t<=2^30. [算法]矩阵快速幂 [题解]将图的邻接矩阵 ...
- bzoj 1875: [SDOI2009]HH去散步
Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但 是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又 ...
- [SDOI2009] HH去散步 (矩阵乘法)
link $solution:$ 将边化为点后重新建矩阵,跑$T-1$幂即可(因为跑的是新边). 最后直接找与$x,y$所相连的边即可. #include<iostream> #inclu ...
随机推荐
- 为什么使用do{}while(0)来进行宏定义
最近发现很多代码在进行宏定义的时候使用喜欢使用 #define MACRO_NAME(para) do{macro content}while(0) 的格式,总结了以下几个原因: 1,空的宏定义避 ...
- 【Linux】Linux基本命令扫盲【转】
转自:http://www.cnblogs.com/lcw/p/3762927.html [VI使用] 1.在命令行模式 :在vi编辑器中将光标放在函数上,shift + k 可直接man手册 ...
- Git管理本地代码(一)【转】
转自:http://blog.csdn.net/weihan1314/article/details/8677800 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 安 ...
- docker安装(2018-03-14版本)
[安装] 说明一: CENTOS或RHEL自带的docker源不一定是最新的,所以必须到docker.com去找到最新的yum源进行安装 说明二: docker的安装方式有两种: 1. 从指定网站获取 ...
- echarts 移动端地图数据可视化开发教程
如上效果图: 以下未代码: <!doctype html> <html lang="en"> <head> <meta charset ...
- MyEclipse文本对比界面样式修改
MyEclipse刚安装好,使用文件对比的时候,发现两边的对比颜色非常浅,不同的地方不容易发现,可以通过以下配置将显示颜色调深一点. 配置 效果
- 激活Win10内置版Linux (ubuntu)
微软自从14316版本后,就开始原生支持Linux Bash命令行. 1.首先到系统设置——更新和安全——针对开发人员——选择开发者模式. 2.控制面板→程序和功能→启用或关闭Windows功能,勾 ...
- Selenium_多线程执行测试用例
多线程执行测试用例 这里以百度搜索为例,通过不同的浏览器来启动不同的线程. #!/usr/bin/env python # _*_ coding:utf-8 _*_ __author__ = 'Yin ...
- ZK分布式锁(未完 待续)
实现思路 公平锁:创建有序节点,判断本节点是不是序号最小的节点(第一个节点),若是,则获取锁:若不是,则监听比该节点小的那个节点的删除事件. 非公平锁:直接尝试在指定path下创建节点,创建成功,则说 ...
- java批量生成excel文件
1.导入用于操作excel的jar,地址:https://pan.baidu.com/s/1qXADRlU 2.生成excel使用的模版文件,地址:https://pan.baidu.com/s/1c ...