十一届院赛 J题 寻找大黄

来源:互联网 发布:电脑软件开发培训班 编辑:程序博客网 时间:2024/04/28 04:41

最暴力的做法比赛的时候都已经写出来了,但是还是超时了。

下来说要矩阵快速幂优化。

那么推一推就出来了,也是很简单。

#include <bits/stdc++.h>using namespace std;#define ll long long#define INF 0x3f3f3f3fstruct Matrix{    double m[205][205];}M;int n,sum[205];Matrix Mult(Matrix a,Matrix b)  //矩阵乘法{    Matrix ans;    for(int i=0;i<n;i++)    {        for(int j=0;j<n;j++)        {            ans.m[i][j]=0.0;            for(int k=0;k<n;k++)                ans.m[i][j]+=a.m[i][k]*b.m[k][j];        }    }    return ans;}Matrix quickpow(Matrix a,int b)     //矩阵快速幂{    Matrix ans;    for(int i=0;i<n;i++)    {        for(int j=0;j<n;j++)        {            if(i==j)                ans.m[i][j]=1.0;            else                ans.m[i][j]=0.0;        }    }    while(b)    {        if(b&1)            ans=Mult(ans,a);        a=Mult(a,a);        b/=2;    }    return ans;}int main(){    int m,k;    while(scanf("%d%d%d",&n,&m,&k)!=EOF)    {        memset(sum,0,sizeof(sum));        for(int i=0;i<=n;i++)        {            for(int j=0;j<=n;j++)                M.m[i][j]=0.0;        }        for(int i=1;i<=m;i++)        {            int u,v;            scanf("%d%d",&u,&v);            u--,v--;            M.m[v][u]+=1.0;            M.m[u][v]+=1.0;            sum[u]++;            sum[v]++;        }        for(int i=0;i<n;i++)        {            for(int j=0;j<n;j++)            {                if(sum[j]!=0.0)                    M.m[i][j]=M.m[i][j]/(double)sum[j];            }        }        M=quickpow(M,k);           Matrix N;        for(int i=0;i<n;i++)        {            for(int j=0;j<n;j++)                N.m[i][j]=0.0;        }        N.m[0][0]=1.0;        M=Mult(M,N);        for(int i=0;i<n;i++)            printf("%f ",M.m[i][0]);        printf("\n");    }return 0;}

0 0