武大校赛PE补题(有一个邻接矩阵求m步从i到j的方法数)

来源:互联网 发布:江苏域名备案查询 编辑:程序博客网 时间:2024/04/30 14:23
#include <iostream>#include <cstring>#include <cstdio>#define maxn 110#define Mod 1000000007using namespace std;class matrix{public:    long long map[maxn][maxn];    matrix(){memset(map,0,sizeof(map));}};matrix multiply(matrix mat,int step,int n);matrix mult(matrix a,matrix b,int n);int main(){    int n,m;   // while(scanf("%d %d",&n,&m)!=EOF)    //{        scanf("%d %d",&n,&m);        matrix mat;        for (int k=0;k<m;k++)//这个记下来就好了        {            int x,y;            scanf("%d %d",&x,&y);            if (x==n) mat.map[y][x]=1;            else if (y==n) mat.map[x][y]=1;            else {mat.map[x][y]=1;mat.map[y][x]=1;}        }        int step;        scanf("%d",&step);        mat.map[n][n]=1;//因为要把步数小于step的留下来所以我们人工在n,n加一条边这样就行了        mat=multiply(mat,step,n);        printf("%I64d\n",mat.map[1][n]);   // }    return 0;}matrix multiply(matrix mat,int step,int n){    matrix ans;    for (int k=1;k<=n;k++)        ans.map[k][k]=1;    while (step)    {        if (step&1) ans=mult(ans,mat,n);        mat=mult(mat,mat,n);        step>>=1;    }    return ans;}matrix mult(matrix a,matrix b,int n){    matrix ans;    for (int i=1;i<=n;i++)        for (int j=1;j<=n;j++)            for (int k=1;k<=n;k++)    {        ans.map[i][j]+=(a.map[i][k]*b.map[k][j])%Mod;        ans.map[i][j]%=Mod;    }    return ans;}

0 0
原创粉丝点击