代码提交上去是AC的,但是在做的过程中有个问题。我是在win上用VS2012编译的,运行的时候出现Stack Overflow,然后我换用了code blocks,也出现了同样的问题,我仔细看了代码,一步一步调试,觉得没有问题,但是运行起来就是出问题。我把N的值改小了点,就可以了。后来我换了linux 的pear系统,N不变,还是210,运行了一下,发现可以运行,结果良好,所以,我就纠结了。希望知情人可以提点我一下,谢谢了。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#define N 210
using namespace std;
struct Mat
{
double mat[N][N];
};
double num[N];
Mat a;
int n;
void init()
{
int q, u, v; double x;
for(int i = 0; i < n; i ++)
scanf("%lf", &num[i]);
for(int i = 0; i < n; i ++)
for(int j = 0; j < n; j ++)
a.mat[i][j] = (i == j);
scanf("%d", &q);
while(q --)
{
scanf("%d%d%lf", &u, &v, &x);
a.mat[u][u] -= x;
a.mat[u][v] += x;
}
}
Mat operator * (Mat a, Mat b)
{
Mat c;
memset(c.mat, 0, sizeof(c.mat));
for(int k = 0; k < n; k ++)
for(int i = 0; i < n; i ++)
{
if(a.mat[i][k] <= 0) continue;
for(int j = 0; j < n; j ++)
{
if(b.mat[k][j] <= 0) continue;
c.mat[i][j] += a.mat[i][k] * b.mat[k][j];
}
}
return c;
}
Mat poww(Mat a, int b)
{
Mat c;
for(int i = 0; i < n; i ++)
for(int j = 0; j < n; j++)
c.mat[i][j] = (i == j);
Mat base = a;
while( b != 0 )
{
if( b & 1 )
c = c * base;
base = base * base;
b >>= 1;
}
return c;
}
int main()
{
int m; double res;
while(~scanf("%d%d", &n, &m)&&(n || m))
{
res = 0;
init();
a = poww(a, m);
for(int i = 0; i < n; i ++)
res += a.mat[i][n - 1] * num[i];
printf("%.0lf\n", res);
}
return 0;
}