ZOJ 2853Evolution

来源:互联网 发布:大闹天空坐骑进阶数据 编辑:程序博客网 时间:2024/06/01 09:38

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2853

#include <iostream>#include <cstdio>#include <cstring>#include <map>#include <vector>using namespace std;typedef vector<double> vec;typedef vector<vec> mat;mat mul(mat &A, mat &B){    mat C(A.size(), vec(B[0].size()));    for (int i = 0; i < A.size(); i++)    for (int k = 0; k < B.size(); k++)    for (int j = 0; j < B[0].size(); j++)        C[i][j] = C[i][j] + A[i][k] * B[k][j];    return C;}mat pow(mat A, int n){    mat B(A.size(), vec(A.size()));    for (int i = 0; i < A.size(); i++)        B[i][i] = 1;    while (n > 0)    {        if (n & 1)            B = mul(B, A);        A = mul(A, A);        n >>= 1;    }    return B;}int main(){    int n, m;    while (cin >> n >> m){        if (n == 0 && m == 0)            break;        mat A(n, vec(n));        mat ANS(n, vec(n));        double tot[205] = { 0 };        for (int i = 0; i < n; i++){            double popul;            cin >> popul;            for (int j = 0; j < n; j++){                ANS[j][i] = popul;            }        }        int T;        cin >> T;        for (int i = 0; i < T; i++){            int s1, s2;            cin >> s1 >> s2;            cin >> A[s1][s2];            tot[s1] += A[s1][s2];        }        for (int i = 0; i < n; i++)            A[i][i] += (1 - tot[i]);        A = pow(A, m);        ANS = mul(ANS, A);        cout << (long long)(ANS[0][n - 1] + 0.5) << endl;    }    return 0;}
0 0
原创粉丝点击