邻接矩阵+矩阵快速幂 可以求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;
} 
全部评论

相关推荐

群星之怒:不是哥们,你就不好奇瘫痪三十年的老植物人是啥样的吗?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务