Evolution ZOJ2853
作者:互联网
矩阵太大导致爆栈
解决方法:矩阵不要开在main函数里面 全部在外面处理 main函数只能处理简单的赋值和加减
损失的要自减!!
最后为 sum+=t[i]*ans.m[i][n-1]; 得到的ans.m 就是一个有向图 代表从i到n-1的转化率
#include<cstdio> #include<iostream> #include<cstring> using namespace std; int n,k; struct matrix { double m[201][201]; }temp,ans; matrix mul(matrix a,matrix b) { matrix c; for(int i=0;i<n;i++) for(int j=0;j<n;j++) { c.m[i][j]=0; for(int q=0;q<n;q++) c.m[i][j]=c.m[i][j]+ a.m[i][q]*b.m[q][j]; } return c; } void fast(void) { memset(ans.m,0,sizeof(ans.m)); for(int i=0;i<n;i++)ans.m[i][i]=1; while(k) { if(k&1)ans=mul(ans,temp); temp=mul(temp,temp); k>>=1; } return ; } int main() { while(scanf("%d%d",&n,&k)==2&&n&&k) { memset(temp.m,0,sizeof(temp.m)); for(int i=0;i<n;i++)temp.m[i][i]=1; int t[201]={0}; for(int i=0;i<n;i++)scanf("%d",&t[i]); int q; scanf("%d",&q); while(q--) { int x,y;double z; scanf("%d%d%lf",&x,&y,&z); temp.m[x][x]-=z; temp.m[x][y]+=z; } fast(); double sum=0; for(int i=0;i<n;i++)sum+=t[i]*ans.m[i][n-1]; printf("%.0f\n",sum); } }
标签:ZOJ2853,Evolution,include,matrix,temp,int,ans,main 来源: https://www.cnblogs.com/bxd123/p/10351571.html