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;
}