wa on #1 99pts help
查看原帖
wa on #1 99pts help
513329
徐晨轩✅楼主2024/3/19 22:25

code:

#include <bits/stdc++.h>
#define int long long
using namespace std;

class Matrix {
public:
    int n, m;
    vector<vector<unsigned int>> v;
    vector<unsigned int>& operator[](int x) {
        return v[x];
    }
    void resize(int r, int c) {
        n = r, m = c;
        v = vector<vector<unsigned int>>(n, vector<unsigned int>(m));
    }
};

Matrix base(int n) {
    Matrix ret;
    ret.resize(n, n);
    for (int i = 0; i < n; i++)
        ret[i][i] = 1;
    return ret;
}

Matrix operator*(Matrix a, Matrix b) {
    if (a.m != b.n)
        throw "a.m != b.n";
    Matrix c;
    c.resize(a.n, b.m);
    for (int i = 0; i < a.n; i++)
        for (int j = 0; j < b.m; j++)
            for (int k = 0; k < a.m; k++)
                c[i][j] += a[i][k] * b[k][j];
    return c;
}

int n, m, k, p = -1, ans;
Matrix f, g[65];

bool check(Matrix x) {
    int sum = 0;
    for (int i = 1; i <= n; i++) {
        sum += x[i][0] - 1;
        if (sum >= k) return 1;
    }
    return 0;
}

signed main() {
    cin >> n >> m >> k;
    f = base(3 * n + 1);
    f[0][0] = 0;
    g[0].resize(3 * n + 1, 3 * n + 1);
    g[0][0][0] = 1;
    for (int i = 1; i <= n; i++) {
        g[0][i][0] = 1;
        g[0][i][i + n] = 1;
        g[0][i + n][i + 2 * n] = 1;
    }
    for (int i = 1, u, v, w; i <= m; i++) {
        cin >> u >> v >> w;
        g[0][u + (w - 1) * n][v]++;
    }
    for (int i = 1; i <= 64; i++) {
        g[i] = g[i - 1] * g[i - 1];
        if (check(g[i])) {
            p = i;
            break;
        }
    }
    if (p == -1) cout << -1 << endl;
    else {
        for (int i = p - 1; i >= 0; i--)
            if (!check(f * g[i])) {
                f = f * g[i];
                ans |= 1LL << i;
            }
        cout << ans << endl;
    }
    return 0;
}
2024/3/19 22:25
加载中...