2017 Wuhan University Programming Contest (Online Round) E. Lost in WHU(矩阵快速幂)
2017-04-12 07:29
169 查看
Lost in WHU
题目链接:Lost in WHUps:比赛前几天离散课上刚讲过,还特意划了重点。。。结果还是没想到矩阵快速幂。。。
题意:给出多对数,每一对数代表这两点之间有一条无向路可以走,然后给出一个时间t,问在t时间内从1到n的路径有多少条
思路:构建邻接矩阵,A(i,j)代表i到j时间为1的路的数目,A^2(i,j)代表i到j时间为2的路的数目……..
但是正常的矩阵最后算出来的是从1到n走t时间的路径的数目,所以初始矩阵中加了一个mat
=1,它的作用就是把<t时间的路径也加起来
解释一下它:
比如说有这样一组数据
1 4
1 2
2 3
2 4
3 4
3
然后构造初始矩阵A
0 1 0 1
1 0 1 1
0 1 0 1
0 0 0 1
上面的mat[1]
代表1到n需要走1单位时间的路径有几条
然后是矩阵A^2
1 0 1 2
0 2 0 3
1 0 1 2
0 0 0 1
这里第一行代表点1到点j需要走2单位时间的路径有几条
最后一列代表点i到点n需要走<=2单位时间的路径有几条(这里就是令mat
=1的妙处了)
矩阵A^3
0 2 0 4
2 0 2 5
0 2 0 4
0 0 0 1
在矩阵A^3中mat[1]
=4,所以答案就是4了(具体详见代码)
代码:
#include<stdio.h> typedef long long LL; const int mod=1e9+7; const int maxn=102; struct Matrix { LL mat[maxn][maxn]; }; Matrix unit_matrix,arr;//单位矩阵 LL n,m,k; Matrix mul(Matrix a,Matrix b)//矩阵相乘 { Matrix res; for(LL i=1; i<=n; ++i) for(LL j=1; j<=n; ++j) { res.mat[i][j]=0; for(LL k=1; k<=n; ++k) res.mat[i][j]=(res.mat[i][j]+a.mat[i][k]*b.mat[k][j])%mod; } return res; } Matrix pow_matrix(Matrix a)//矩阵快速幂 { Matrix res=unit_matrix; while(k) { if(k&1) res=mul(res,a); a=mul(a,a); k>>=1; } return res; } int main() { scanf("%lld%lld",&n,&m); for(LL i=1; i<=n; ++i) for(LL j=1; j<=n; ++j) unit_matrix.mat[i][j]=(i==j); LL x,y; for(LL i=1; i<=m; ++i) { scanf("%lld%lld",&x,&y); arr.mat[x][y]=arr.mat[y][x]=1;//构造初始矩阵 if(y==n)//到n之后就不能再走了,所以去掉n到其他点的路径 arr.mat[y][x]=0; if(x==n)//同理 arr.mat[x][y]=0; } arr.mat =1;//计算的是<=k步的路径总数 scanf("%lld",&k); Matrix ans=pow_matrix(arr); printf("%lld\n",ans.mat[1] ); return 0; }
相关文章推荐
- 2017 Wuhan University Programming Contest (Online Round) E. Lost in WHU(矩阵快速幂)
- 2017 Wuhan University Programming Contest (Online Round) E. Lost in WHU(矩阵快速幂)
- 2017 Wuhan University Programming Contest (Online Round) E. Lost in WHU(矩阵快速幂)
- 2017 Wuhan University Programming Contest (Online Round) E. Lost in WHU(矩阵快速幂)
- 2017 Wuhan University Programming Contest (Online Round) E. Lost in WHU(矩阵快速幂)
- 2017 Wuhan University Programming Contest (Online Round) E. Lost in WHU(矩阵快速幂)
- 2017 Wuhan University Programming Contest (Online Round) E. Lost in WHU(矩阵快速幂)
- 2017 Wuhan University Programming Contest (Online Round) E. Lost in WHU(矩阵快速幂)
- 2017 Wuhan University Programming Contest (Online Round) E. Lost in WHU(矩阵快速幂)
- 2017 Wuhan University Programming Contest (Online Round) E. Lost in WHU(矩阵快速幂)
- 2017 Wuhan University Programming Contest (Online Round) E. Lost in WHU(矩阵快速幂)
- 2017 Wuhan University Programming Contest (Online Round) E Lost in WHU(矩阵快速幂
- 2017 Wuhan University Programming Contest (Online Round) E. Lost in WHU(矩阵快速幂)
- 2017 Wuhan University Programming Contest (Online Round) E. Lost in WHU(矩阵快速幂)
- 2017 Wuhan University Programming Contest (Online Round) E. Lost in WHU(矩阵快速幂)
- 2017 Wuhan University Programming Contest (Online Round) Lost in WHU 矩阵快速幂 一个无向图,求从1出发到达n最多经过T条边的方法数,边可以重复经过,到达n之后不可以再离开。
- 2017 Wuhan University Programming Contest --Lost in WHU
- WOJ 26. Lost in WHU(矩阵快速幂变形)
- 2017 Wuhan University Programming Contest (Online Round)(补题补题)
- E. Lost in WHU。矩阵快速幂!