Submission #104621

#TimeUsernameProblemLanguageResultExecution timeMemory
104621lycTravelling Merchant (APIO17_merchant)C++14
100 / 100
115 ms3324 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair<int, int> ii;
typedef pair<int, ii> iii;
typedef pair<ii, int> ri3;
#define mp make_pair
#define pb push_back
#define fi first
#define sc second
#define SZ(x) (int)(x).size()
#define ALL(x) begin(x), end(x) 
#define REP(i, n) for (int i = 0; i < n; ++i) 
#define FOR(i, a, b) for (int i = a; i <= b; ++i)
#define RFOR(i, a, b) for (int i = a; i >= b; --i)

int main() {
    //freopen("in.txt", "r", stdin);
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n, m, x; cin >> n >> m >> x;
    int b[n][x], s[n][x];
    FOR(i, 0, n-1) {
        FOR(j, 0, x-1) {
            cin >> b[i][j] >> s[i][j];
        }
    }

    int am1[n][n];
    memset(am1, -1, sizeof am1);
    FOR(i, 0, m-1) {
        int u, v, w; cin >> u >> v >> w;
        --u, --v;
        am1[u][v] = w;
    }

    FOR(k, 0, n-1) FOR(i, 0, n-1) if (am1[i][k] != -1) FOR(j, 0, n-1) if (am1[k][j] != -1) {
        if (am1[i][j] == -1 || am1[i][k]+am1[k][j]<am1[i][j])
            am1[i][j] = am1[i][k]+am1[k][j];
    }

    int am2[n][n];
    FOR(i, 0, n-1) FOR(j, 0, n-1) {
        am2[i][j] = 0;
        FOR(k, 0, x-1) if (s[j][k] != -1 && b[i][k] != -1) am2[i][j] = max(am2[i][j], s[j][k]-b[i][k]);
    }

    int lo = 0, hi = 1e9+10;
    while (lo < hi) {
        int mid = (lo+hi)/2;

        //sum(w) / sum(dist) >= r;
        //sum(w) - r*sum(dist) >= 0;
        //sum(w - r*dist) >= 0;
        #define NINF (-1e18)
        ll am3[n][n];
        FOR(i, 0, n-1) FOR(j, 0, n-1) {
            if (am1[i][j] != -1) {
                am3[i][j] = (ll)am2[i][j] - (ll)mid*am1[i][j];
            }
            else {
                am3[i][j] = NINF;
            }
        }

        FOR(k, 0, n-1) FOR(i, 0, n-1) if (am3[i][k] != NINF) FOR(j, 0, n-1) if (am3[k][j] != NINF) {
            am3[i][j] = max(am3[i][j], am3[i][k]+am3[k][j]);
        }

        bool ok = false;
        FOR(i, 0, n-1) ok |= am3[i][i] >= 0;
        
        if (ok) lo = mid+1;
        else hi = mid;
    }
    cout << lo-1 << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...