快速矩阵幂-有向图
来源:互联网 发布:钥匙扣淘宝 编辑:程序博客网 时间:2024/05/19 15:19
给定一个有向图,问从A点恰好走k步(允许重复经过边)到达B点的方案数mod p的值
把给定的图转为邻接矩阵,即A(i,j)=1当且仅当存在一条边i->j。令C=A*A,那么C(i,j)=ΣA(i,k)*A(k,j),
实际上就等于从点i到点j恰好经过2条边的路径数(枚举k为中转点)。类似地,C*A的第i行第j列就
表示从i到j经过3条边的路径数。同理,如果要求经过k步的路径数,我们只需要二分求出A^k即可。
代码实现:
/*////////////////////////////////////////////////////////////*/#include <cstdio>#include <cstring>#include <cmath>int n,mod=10000;struct Matrix{ int m[30][30];void clear(){memset(m,0,sizeof(m));}}E, Z;Matrix Mut(Matrix A, Matrix B){ Matrix ans; for (int i = 0; i<n; i++) for (int j = 0; j<n; j++) { ans.m[i][j] = 0; for (int k = 0; k<n; k++) { ans.m[i][j] += ((A.m[i][k])*(B.m[k][j])); } } return ans;}Matrix Pow(Matrix A, int b){ Matrix t = A, ans = E; while (b) { if (b % 2) ans = Mut(ans, t); b /= 2; t = Mut(t, t); } return ans;}int main(){ // freopen("in.txt", "r", stdin);Matrix A;int t;while(scanf("%d",&n)!=EOF){//输入邻接矩阵for(int i=0;i<n;i++)for(int j=0;j<n;j++)scanf("%d",&A.m[i][j]);//输入要查找的边,步数int a,b,k; scanf("%d %d %d",&a,&b,&k);E=A;Matrix ans=Pow(A,k-1);printf("%d\n",ans.m[a-1][b-1]);} return 0;}
0 0
- 快速矩阵幂-有向图
- The Shortest Path(矩阵快速幂构造有向图+floyed算法求图多源最短路)
- 矩阵快速幂<求有向图路径为k的方案(每条边可以取多次)>
- 【算法导论】有向图的可达矩阵
- 有,无向图的简单矩阵创建
- poj 2778 AC自动机构建有向图 + 邻接矩阵快速幂
- 【有限制的 Pólya+矩阵快速幂】poj2888
- 快速矩阵快速幂
- 计算有向图可达矩阵Matlab实现
- 转移矩阵+矩阵快速幂
- 矩阵乘法 矩阵快速幂
- 构造矩阵+矩阵快速幂
- 矩阵快速幂,矩阵加法,矩阵乘法
- Java求出矩阵表示的有向图所有的强连通分支程序设计过程
- 邻接矩阵A和A的转置矩阵乘积表示的意义(有向图)
- HDU 2254-奥运(有向图的邻接矩阵+矩阵乘法)
- bzoj 4894: 天赋 矩阵树定理求有向图生成树数量
- 快速幂||矩阵快速幂
- VideoCapture open vedio file fail
- SVN 常用命令
- C++内存管理详解
- iOS实现圆形头像
- 《敏捷软件开发》--读书笔记
- 快速矩阵幂-有向图
- Android Studio的艰辛历程
- seajs最常用7个功能、配置
- kernel study web
- iOS 手机号码格式检测
- 支持国货,利用C#操作WPS Office2013 实例
- 数据压缩与信息熵
- threadid=3: reacting to signal 3 threadid=3: spin on suspend #1 threadid=19 (pcf=0)
- Android下划线