[BZOJ1975]HH去散步 图论+矩阵


题目大意

要求出在一个m条边,n个点的图中,相邻两次走的边不能相同,求在t时间时从起点A走到终点B的路径方案总数。将答案mod45989

输入格式:
第一行:五个整数N,M,t,A,B。
后面的m行,每行有两个数 ai a_i bi b_i,表示路口 ai a_i bi b_i有有一条边。
输出格式:
一个整数,表示答案。

输入输出样例
input
4 5 3 0 0
0 1
0 2
0 3
2 1
3 2
output
4

Hint

对于30%的数据,N ≤ 4,M ≤ 10,t ≤ 10。 对于100%的数据,N ≤ 20,M ≤ 60,t ≤ 2^30,0 ≤ A,B


解题分析
题目问你路径的方案总数,首先就想到要用矩阵+floyd的算法来求。
我们根据floyd的原理可以知道 L[i][j]=∑k=1nL[i][k]∗L[k][j] L[i][j]=\sum\limits_{k=1}^{n}L[i][k]*L[k][j]
所以我们可以建立一个矩阵 g[i][j] g[i][j]代表有一条从i到j的比。将这个矩阵幂t次, g[i][j] g[i][j]就代表i到j的走t条边的方案数。
因为这一题相邻两次走的边不能相同,所以我们就将边变成点来求方案数。
那么怎么统计答案呢?我们可以有一个转移矩阵2m*2m,其中 f[i][j] f[i][j]代表第i条边(原图中)的起点与第j条边(原图中)是一个点(且ij不能是同一条边),就代表点(新图)i与点(新图)j是相连的。答案矩阵是一个1*2m的矩阵, ans[1][i] ans[1][i]代表第i(原图)条边的终点为题目给的A.把ans与自乘t次的F矩阵相乘。然后
 

∑ans[1][i](i代表终点为B的点(原图的边))

\sum ans[1][i](i代表终点为B的点(原图的边))就是答案。
其实我们可以理解为,ans就是加了一个虚点,代表着一个与所有起点为A的点(原图中的边)相连的点。乘后的ans代表这个虚点到所以点的方案。我们只要统计终点为B的点的方案数就可以了。
代码自带大常数==!

#include <stdio.h>
#include <iostream>
#include <cmath>
#include <queue>
#include <algorithm>
#include <cstring>
#include <climits>
#include <cstdlib>
#define MAXN (60+10)*2
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
using namespace std;
int mod=45989,n,m,a,b,t,num,head[MAXN],tot,tail[MAXN],M;
struct Edge{int next,to,from,next1;
}edge[MAXN<<1];
void add(int from,int to)
{edge[++num].next=head[from];edge[num].next1=tail[to];edge[num].to=to;edge[num].from=from;head[from]=num;tail[to]=num;
}
struct matrix{int n,m;int data[MAXN][MAXN];void print(){for(int i=1;i<=n;i++){for(int j=1;j<=m;j++)printf("%d ",data[i][j]);printf("\n");}}matrix operator * (matrix b){matrix ans;memset(ans.data,0,sizeof(ans.data));ans.n=n;ans.m=b.m;for(int i=1;i<=ans.n;i++) for(int j=1;j<=ans.m;j++) for(int k=1;k<=ans.m;k++)ans.data[i][j]+=(data[i][k]*b.data[k][j])%mod,ans.data[i][j]%=mod;return ans;}void too(matrix b){n=b.n;m=b.m;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)data[i][j]=b.data[i][j];}
}f,ans,zero,pf;
void power(int k)
{    if(k==1) pf=f;else{power(k/2);if(k%2==1) pf=pf*pf,pf=pf*f;else pf=pf*pf;}
}
int main()
{scanf("%d%d%d%d%d",&n,&m,&t,&a,&b);for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);add(x,y);add(y,x);}f.n=f.m=2*m;ans.n=1;ans.m=2*m;M=2*m;for(int i=head[a];i;i=edge[i].next) ans.data[1][i]=1;for(int s=0;s<n;s++)for(int i=head[s];i;i=edge[i].next)for(int j=head[edge[i].to];j;j=edge[j].next)if((i+1)!=((j+1)^1)){f.data[i][j]++;}power(t-1);ans=ans*pf;for(int i=tail[b];i;i=edge[i].next1) tot=(tot+ans.data[1][i])%mod;printf("%d\n",tot);return 0;
}

[BZOJ1975]HH去散步 图论+矩阵相关推荐

  1. [SDOI2009]HH去散步(矩阵)

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

  2. P2151-[SDOI2009]HH去散步【矩阵乘法】

    正题 题目链接:https://www.luogu.com.cn/problem/P2151 题目大意 nnn个点mmm条边的一张无向图,走过一条边后下一次就不能再走这条,求AAA到BBB之间有多少长 ...

  3. 迎开学水题狂欢赛(舞踏会[dp+三叉树],HH去散步[矩阵快速幂],排序[模拟],铁路旅行[线段树])

    快速简单记录老师口胡(可能就我自己看得懂了吧-) 文章目录 T1:舞踏会 title solution code T2:HH去散步 title solution code T3:排序 title so ...

  4. P2151 [SDOI2009]HH去散步

    P2151 [SDOI2009]HH去散步 题意: HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻 ...

  5. 【BZOJ1875/SDOI2009】HH去散步

    1875: [SDOI2009]HH去散步 Time Limit: 20 Sec  Memory Limit: 64 MB                                       ...

  6. BZOJ 1875[SDOI2009]HH去散步

    题面: 1875: [SDOI2009]HH去散步 Time Limit: 20 Sec  Memory Limit: 64 MB Submit: 1750  Solved: 851 [Submit] ...

  7. 【codevs2304】【BZOJ1875】HH去散步,第一次的矩阵加速DP

    传送门1 传送门2 写在前面:今天冒傻气 思路:我第一眼没有看出来它是个矩阵乘法加速DP,只觉得如果这个t小点就直接广搜可以了,后来发现网上的题解无一例外都是矩阵快速幂的时候,我的表情 后来看了看黄学 ...

  8. BZOJ 1875 [SDOI2009]HH去散步 矩阵乘法

    题意: 给定一张无向图,每条路的长度都是1,没有自环,可能有重边,给定起点与终点,求从起点走t步到达终点的方案数. 每一步走的时候要求不能走上一条刚刚走的路. 解析: 显然需要搞出个矩阵之后矩乘. 然 ...

  9. 矩阵——洛谷P2151 [SDOI2009]HH去散步

    https://daniu.luogu.org/problem/show?pid=2151#sub 题目就是说我们不可以回走: 但是环还是可以的: 如果上次1->3 现在不可以直接3->1 ...

最新文章

  1. Netflix这公司居然没有运维,也没有CTO
  2. J. Med. Chem. | 通过负向设计优化筛选化合物库
  3. 在weex 中的引入 Ethereum -web3.js
  4. zipfile不能解压分卷压缩的文件
  5. 设计模式在Netty 中的应用-策略模式源码举例
  6. IIS的真正并发数及扩展并发的办法
  7. oracle允许空行,oracle用户权限的一些基本操作
  8. python画roc曲线_使用Python画ROC曲线以及AUC值
  9. Windbg简明教程(转)
  10. 实时获取麦克风语音信号
  11. nodejs的req取参req.body,req.params,req.query
  12. 35行的山寨版jQuery
  13. java注释指导手册
  14. 企业邮箱设置,企业邮箱服务器怎么设置?
  15. Android audio 三 AudioRecord 分析下
  16. 预备期:全通卫浴、宝龙橱柜、宏星地板、三夏地板
  17. LeetCode——1849. 将字符串拆分为递减的连续值(Splitting a String Into Descending Consecutive Val..)[中等]——分析及代码(Java)
  18. HTML学习之块级元素和行内元素的特征和区别(一)
  19. 前端开发入门到实战:JavaScript字符串转换数字
  20. [附源码]计算机毕业设计JAVAjsp校园志愿者服务管理系统

热门文章

  1. Mifare S50与Mifare S70
  2. survival | 生存分析(5):加速失效时间模型(Accelerated Failure Time Model)
  3. android 输入法如何启动流程_Android程序打开和关闭输入法
  4. 玩树莓派(raspberry pi) 2/3 raspbian的遇到的一些问题
  5. 前端知识质量内容网址
  6. 笔记 | 人工智能导论 语义网络表示
  7. 梯度下降与随机梯度下降
  8. ASP.NET WEBAPI实现微信接入验证
  9. 65nm粒径量子点MMSNs-HRP-CDs/CP-CDs结合酶/蛋白/荧光的制备过程
  10. 阿里云VPC网络内网实例通过SNAT连接外网