离散数学:矩阵

来源:互联网 发布:linux vsftpd 启动 编辑:程序博客网 时间:2024/06/07 03:50

根据离散数学:一个由0,1构成的矩阵A,任意常数k,A^k次表示矩阵中任意点经过k条路径到任意点的的方法数,点可以重复走。

这是一个很重要的图论知识,POJ2888就有运用到。

#include<iostream>#include<cstdio>#include<cstring>using namespace std;int u,v;const int mod=9973;struct Matrix{    int Mat[15][15];};Matrix operator * (Matrix a,Matrix b){    Matrix c;    for(int i=0;i<6;i++)    {        for(int j=0;j<6;j++)        {            c.Mat[i][j]=0;            for(int k=0;k<6;k++)            {                c.Mat[i][j]=(c.Mat[i][j]+a.Mat[i][k]*b.Mat[k][j])%mod;            }        }    }    return c;}Matrix operator ^ (Matrix a,int b){    Matrix temp;    Matrix base=a;    memset(temp.Mat,0,sizeof(temp.Mat));    for(int i=0;i<6;i++) temp.Mat[i][i]=1;    while(b)    {        if(b&1) temp=temp*base;        base=base*base;        b>>=1;    }    return temp;}//int solve(Matrix a,int b)//{//    int ret=0;//    Matrix temp=a^b;//    for(int i=0;i<m;i++)//        ret=(ret+temp.Mat[i][i])%mod;//    return ret;//}int main(){    Matrix p;    memset(p.Mat,0,sizeof(p.Mat));    while(cin>>u>>v)    {        if(u+v==0) break;        p.Mat[u][v]=1;    }    for(int i=0;i<6;i++)    {        for(int j=0;j<6;j++)        {            cout<<p.Mat[i][j]<<" ";        }        cout<<endl;    }    Matrix temp=p^3;    cout<<temp.Mat[5][4]<<endl;    return 0;}


0 0
原创粉丝点击