hdu 2157

来源:互联网 发布:tensorflow教程pdf 编辑:程序博客网 时间:2024/06/16 13:31
/*此题目乍一看是个图论求路径数目的问题,但不好求解,可以考虑a[i][j]=a[i][k]*a[k][j]i到j经过一个点是否有一条路,取决于i到k是否有一条路*k到j是否有一条路,不断累乘,可以求出i到j经过m个点的方案数*/#include<cstdio>#include<iostream>#include<cstdlib>#include<algorithm>#include<cstring>#define LL long long#define maxn 35#define MOD 1000 using namespace std;int n,m,q;typedef struct{int z[maxn][maxn];}matrix;matrix mulmatrix(matrix a,matrix b){matrix s;memset(s.z,0,sizeof(s.z));for(int i=0;i<n;i++){for(int j=0;j<n;j++){for(int k=0;k<n;k++){s.z[i][j]+=a.z[i][k]*b.z[k][j];s.z[i][j]%=MOD;}}}return s;}matrix powmatrix(matrix a,int k){matrix s;memset(s.z,0,sizeof(s.z));for(int i=0;i<n;i++)s.z[i][i]=1;while(k){if(k&1)s=mulmatrix(s,a);a=mulmatrix(a,a);k>>=1;}return s;}int main(){while(cin>>n>>m){if(n==0&&m==0)break;matrix t,res;memset(t.z,0,sizeof(t.z));for(int i=0;i<m;i++){int a,b;cin>>a>>b;t.z[a][b]=1;}cin>>q;for(int i=0;i<q;i++){int x,y,u;cin>>x>>y>>u;res=powmatrix(t,u);cout << res.z[x][y] << endl;}}return 0;} 

原创粉丝点击