邻接矩阵+矩阵快速幂 可以求i点到其他点的方案数
小A的路径
https://ac.nowcoder.com/acm/contest/13621/E
矩阵:a,c
c=a*a
矩阵a的第i行k列 * a的k行j列 (!=0的话)
表示i点可以到达k点,而k点又可以到达j点,即i点可以到达j点
所以c[i][j] (c的i行j列)表示i到j(是否可行)或方案数
//
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int const N=1e2+7;
int const mod=1000000007;
int n,m,k,s;
struct mat{
ll a[N][N];
mat(){
memset(a,0,sizeof a); //这里一定要初始化
}
void init(){
for(int i=1;i<=n;++i){
a[i][i]=1;
}
}
mat operator*(mat const &b){
mat res;
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
for(int k=1;k<=n;++k){
res.a[i][j]=(res.a[i][j]+a[i][k]*b.a[k][j]%mod)%mod;
}
}
}
return res;
}
}mr,z;
mat ksm(mat a,ll b){
mat res;res.init();
while(b){
if(b&1) res=res*a;
a=a*a;
b >>= 1;
}
return res;
}
int main(){
cin >> n >> m >> k >> s;
for(int i=1;i<=m;++i){
int b,c;
cin >> b >> c;
mr.a[b][c]++;
}
z=ksm(mr,k);
ll ans=0;
for(int j=1;j<=n;++j){
if( z.a[s][j]&&j!=s ) ans+=z.a[s][j]%mod;
}
cout << ans%mod;
return 0;
}
正浩创新EcoFlow公司福利 754人发布