如果没有题里的“不会立刻沿着刚刚走来的路走回”限制,那么直接矩乘计算k步的方案数

但加了这个限制,就不能以点来矩乘了,考虑边数<=60,如果以边建邻接矩阵呢??

先拆边,再把每一个边和以其终点为起点的边相连,注意不能是拆前的同一条边。

然后矩阵乘喽。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define mod 45989
using namespace std;
int a[122][122],b[122],c[122][122],d[122];
int ans,n,m,t,S,T;
bool bo;
int e=1,head[22];
struct edge{
int u,v,next;
}ed[122];
void add(int u,int v){
ed[e].u=u; ed[e].v=v;
ed[e].next=head[u];
head[u]=e++;
}
void work(int A[122][122],int B[122][122],int C[122][122]){
int D[122][122];
for(int i=1;i<=2*m;i++)
for(int j=1;j<=2*m;j++){
D[i][j]=0;
for(int k=1;k<=2*m;k++)
D[i][j]=(D[i][j]+(A[i][k]*B[k][j])%mod)%mod;
}
for(int i=1;i<=2*m;i++)
for(int j=1;j<=2*m;j++)
C[i][j]=D[i][j];
}
int main()
{
int u,v;
scanf("%d%d%d%d%d",&n,&m,&t,&S,&T); S++; T++;
for(int i=1;i<=m;i++){
scanf("%d%d",&u,&v);
u++; v++;
add(u,v); add(v,u);
}
for(int i=1;i<=2*m;i++)
for(int j=1;j<=2*m;j++){
if(ed[i].v==ed[j].u)
a[i][j]=1;
}
for(int i=1;i<=2*m;i+=2) a[i][i+1]=a[i+1][i]=0;
for(int i=1;i<=2*m;i++) c[i][i]=1; for(int i=head[S];i;i=ed[i].next) b[i]=1;
t--; while(t){
if(t&1) work(a,c,c);
work(a,a,a);
t>>=1;
} for(int i=1;i<=2*m;i++)
for(int j=1;j<=2*m;j++)
d[i]=(d[i]+(b[j]*c[j][i])%mod)%mod; for(int i=1;i<=2*m;i++)
if(ed[i].v==T) ans=(ans+d[i])%mod;
printf("%d\n",ans);
return 0;
}

sdoi 2009 HH去散步 矩阵乘的更多相关文章

  1. [BZOJ 1875] [SDOI 2009] HH去散步【矩阵乘法】

    题目链接:BZOJ - 1875 题目分析: 这道题如果去掉“不会立刻沿着刚刚走来的路走回”的限制,直接用邻接矩阵跑矩阵乘法就可以了.然而现在加了这个限制,建图的方式就要做一些改变.如果我们把每一条边 ...

  2. [SDOI 2009]HH去散步

    Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但 是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又 ...

  3. bzoj 1875: [SDOI2009]HH去散步 -- 矩阵乘法

    1875: [SDOI2009]HH去散步 Time Limit: 20 Sec  Memory Limit: 64 MB Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走, ...

  4. 洛谷P2151 [SDOI2009] HH去散步 [矩阵加速]

    题目传送门 HH去散步 题目描述 HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走 ...

  5. 【bzoj1875】[SDOI2009]HH去散步 矩阵乘法

    题目描述 一张N个点M条边的无向图,从A走到B,要求:每一次不能立刻沿着上一次的边的反方向返回.求方案数. 输入 第一行:五个整数N,M,t,A,B. N表示学校里的路口的个数 M表示学校里的路的条数 ...

  6. BZOJ1875 [SDOI2009]HH去散步 矩阵

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1875 题意概括 在一个无向图(有重边无自环)中走,不能在经过连续经过某一条边2次. 现在走t步,问 ...

  7. [luogu2151 SDOI2009] HH去散步 (矩阵快速幂)

    传送门 题目描述 HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又因为HH ...

  8. [SDOI2009] HH去散步 (矩阵乘法)

    link $solution:$ 将边化为点后重新建矩阵,跑$T-1$幂即可(因为跑的是新边). 最后直接找与$x,y$所相连的边即可. #include<iostream> #inclu ...

  9. 【BZOJ】1875: [SDOI2009]HH去散步 矩阵快速幂

    [题意]给定n个点m边的无向图,求A到B恰好经过t条边的路径数,路径须满足每条边都和前一条边不同.n<=20,m<=60,t<=2^30. [算法]矩阵快速幂 [题解]将图的邻接矩阵 ...

随机推荐

  1. tvtk管线技术、数据集与数据加载

    管线技术也称流水线技术(Pipeline)每个对象只实现相对简单的任务,整个管线进行复杂的可视化处理在tvtk中分为可视化管线和图形管线 可视化管线(Visualization Pipeline):将 ...

  2. Collections.sort自定义排序的使用方法

    Collections.sort自定义排序的使用方法 总结:Collections可以对List进行排序:如果想对Map进行排序,可以将Map转化成List,进行排序: public static v ...

  3. Oracle官方文档学习路线图

  4. FFPLAY的原理

    概要 电影文件有很多基本的组成部分.首先,文件本身被称为容器Container,容器的类型决定了信息被存放在文件中的位置.AVI和Quicktime就是容器的例子.接着,你有一组流,例如,你经常有的是 ...

  5. 如何使你的Ajax应用内容可让搜索引擎爬行

    This document outlines the steps that are necessary in order to make your AJAX application crawlable ...

  6. POSTGRESQL 并发控制

    http://meidayhxp.blog.163.com/blog/static/117608156201210243837491/ 这个内容是官方Doc中的一章,具体是那一版的,还未确认. 第九章 ...

  7. 使用Swashbuckle构建RESTful风格文档

    本次和大家分享的是Swagger to WebApi的nuget包Swashbuckle:因为项目需要统一api文档的风格,并要支持多种开发语言(C#,java,python),所以首先想到的是swa ...

  8. gradle 将依赖打入Jar包的方法

    使用的是IDEA,直接引入 plugins { id 'com.github.johnrengelman.shadow' version '1.2.3' } 放在build.gradle的最上面,然后 ...

  9. 四年级--python函数基础用法

    一.函数的定义,调用和返回值 1.1 语法 def 函数(参数一,参数二...): ''' 文档注释 ''' 代码逻辑一 代码逻辑二 .... return 返回值 1.2 定义函数的三种形式 说明: ...

  10. CentOS在线安装RabbitMQ3.7

    一.通过yum命令在线安装RabbitMQ yum在线安装,简单.快捷.自动安装相关依赖包. 1.安装Erlang环境(RabbitMQ由Erlang语言开发) 1.1)下载rpm安装包 官方地址:h ...