0
点赞
收藏
分享

微信扫一扫

HDU 2157 How many ways??


题目地址:​​点击打开链接​​

思路:矩阵快速幂+有向可达图,仔细推敲一下,就能明白,矩阵乘以几次,就是经过几个点,而且里面包含了走重复边的可能

AC代码:

#include <iostream>
#include <cstring>

using namespace std;

int per[21][21],s[21][21],middle[21][21],n;

void matrix_mul(int a[21][21],int b[21][21])//数组就是在原地址上进行操作
{
int i,j,k,c[21][21] = {0};
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
for(k=0; k<n; k++)
{
c[i][j] = (c[i][j] + a[i][k] * b[k][j]) % 1000;//仔细观察坐标,挺好记的
}
}
}
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
a[i][j] = c[i][j];
}
}
}

int matrix_result(int a,int b,int k)
{
int i,j;
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
per[i][j] = (i == j);//初始化为单位矩阵
}
}
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
middle[i][j] = s[i][j];
}
}
while(k)
{
if(k & 1)
matrix_mul(per,middle);
matrix_mul(middle,middle);
k >>= 1;
}
return per[a][b];
}
int main()
{
int m,t,x,y,k,i;
while(cin>>n>>m,m+n)
{
memset(s,0,sizeof(s));
for(i=0; i<m; i++)
{
cin>>x>>y;
s[x][y] = 1;
}
cin>>t;
while(t--)
{
cin>>x>>y>>k;
cout<<matrix_result(x,y,k)<<endl;
}
}
}

举报

相关推荐

0 条评论