http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2853
//1865331 2009-05-11 21:26:46 Accepted 2853 C++ 3790 1484 aslys #include<iostream> using namespace std; const int N = 204; int n; double matrix[N][N]; double x[N][N],y[N][N],z[N][N]; void fun(int k,double m[][N]) { int i,j,p,t; double sum; if(k == 1) //矩阵的一次方 { for(i=0;i<n;i++) for(j=0;j<n;j++) m[i][j] = matrix[i][j]; } else if(k == 2) //矩阵的二次方 { for(i=0;i<n;i++) for(j=0;j<n;j++) { sum = matrix[i][0] * matrix[0][j]; for(p=1;p<n;p++) sum += matrix[i][p] * matrix[p][j]; m[i][j] = sum; } } else //矩阵的 k 次方 ,先计算出 k/2 次方 ,加快计算速度 { t = k/2; fun(t,x); //递归调用 for(i=0;i<n;i++) for(j=0;j<n;j++) { sum = x[i][0] * x[0][j]; for(p=1;p<n;p++) sum += x[i][p] * x[p][j]; y[i][j] = sum; } if( k % 2 == 1) // 比如对矩阵A :A^9 = A^4 * A^4 * A { for(i=0;i<n;i++) for(j=0;j<n;j++) { sum = matrix[i][0] * y[0][j]; for(p=1;p<n;p++) sum += matrix[i][p] * y[p][j];; m[i][j] = sum; } } else { for(i=0;i<n;i++) for(j=0;j<n;j++) m[i][j] = y[i][j]; } } }
int main() { int m; while(scanf("%d%d",&n,&m)!=EOF) { if( m==0 && n==0 ) break; int i,j,k; double num[N],r; for(i=0;i<n;i++)//init() for(j=0;j<n;j++) { if(i == j) matrix[i][j] = 1.0; else matrix[i][j] = 0.0; }
for(i=0;i<n;i++) scanf("%lf",&num[i]);
scanf("%d",&k); while(k--) { scanf("%d%d%lf",&i,&j,&r); matrix[j][i] += r; //构建初始矩阵 matrix[i][i] -= r; }
fun(m,z); //求矩阵的m次方,结果放在 x 数组中
r = 0.0; for(j=0;j<n;j++) r += z[n-1][j] * num[j]; printf("%.0lf\n",r); } return 0; } /**//* 3 1 40 20 10 2 0 1 1 1 2 1 3 2 40 20 10 2 0 1 1 1 2 1 */
|