FZU 1627Revival's road

来源:互联网 发布:mac电脑有什么游戏好玩 编辑:程序博客网 时间:2024/06/05 07:40

http://acm.fzu.edu.cn/problem.php?pid=1627




给一张图,每走一步为1s,求正好在k秒到达终点的走的方法数。
以前做过类似的题目,利用矩阵相乘的知识可得到,将地图转换为01矩阵,该矩阵的x次方即为在x秒时(或者是走过x个点)从i到j的方法数。
所以这题用矩阵快速幂即可。





#include<iostream>#include<cstring>using namespace std;struct node{int ma[111][111];};int MOD=10000;int n,m,k;node b;node operator * (node x,node y){node ans;int i,j,k;for(i=1;i<=n;i++){for(j=1;j<=n;j++)ans.ma[i][j]=0;}for(i=1;i<=n;i++){for(j=1;j<=n;j++){for(k=1;k<=n;k++){ans.ma[i][j]=(ans.ma[i][j]+x.ma[i][k]*y.ma[k][j])%MOD;}}}return ans;}node operator ^ (node a, int dis){node c;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(i==j)c.ma[i][j]=1;else c.ma[i][j]=0;}}while(dis){if(dis%2==1)c=c*a;a=a*a;dis/=2;}return c;}int main(){    while(cin>>n>>m>>k)    {    node a;        int i;        int x,y;for(i=1;i<=n;i++){for(int j=1;j<=n;j++){a.ma[i][j]=0;}}        for(i=1;i<=m;i++)        {        scanf("%d%d",&x,&y);        a.ma[x][y]=1;}a=a^k;cout<<a.ma[1][n]%MOD<<endl;}return 0;}




原创粉丝点击