Submission #1092563

#TimeUsernameProblemLanguageResultExecution timeMemory
1092563May27_thTravelling Merchant (APIO17_merchant)C++17
0 / 100
19 ms2136 KiB
// #pragma GCC optimize("O3")
// #pragma GCC optimize("unroll-loops")
// #pragma GCC target("avx2,bmi,bmi2,popcnt,lzcnt")
#include<bits/stdc++.h>
 
using namespace std;
 
#define i64 long long
#define mp make_pair
#define pb push_back
#define all(x) (x).begin(), (x).end()

const int MAXN = 102;
const int MAXK = 1003;
const i64 INF = 1e7;
int N, M, K;
i64 d[MAXN][MAXN], buy[MAXN][MAXK], sell[MAXN][MAXK];
pair<i64, i64> f[MAXN][MAXN];
void Maximize(pair<i64, i64> &a, pair<i64, i64> b) {
  /*
    a < b
    a.first/a.second < b.first/b.second
  */
  if (a.first * b.second < b.first * a.second) {
    a = b;
  }
}
void Solve(void) {  
  cin >> N >> M >> K;
  for (int i = 1; i <= N; i ++) {
    for (int j = 1; j <= K; j ++) cin >> buy[i][j];
    for (int j = 1; j <= K; j ++) cin >> sell[i][j];
  }
  for (int i = 1; i <= N; i ++) {
    for (int j = 1; j <= N; j ++) {
      d[i][j] = (i != j ? INF : 0);
    }
  }
  for (int i = 1; i <= M; i ++) {
    int u, v; i64 w; cin >> u >> v >> w;
    d[u][v] = min(d[u][v], w);
  }
  for (int k = 1; k <= N; k ++) {
    for (int u = 1; u <= N; u ++) {
      for (int v = 1; v <= N; v ++) {
        if (d[u][k] < INF && d[k][v] != INF) {
          d[u][v] = min(d[u][v], d[u][k] + d[k][v]);
        }
      }
    }
  }
  for (int u = 1; u <= N; u ++) {
    for (int v = 1; v <= N; v ++) {
      i64 profit = 0;
      if (u != v) {
        for (int k = 1; k <= K; k ++) {
          if (buy[u][k] != -1 && sell[v][k] != -1) {
            profit = max(profit, sell[v][k] - buy[u][k]);
          }
        }
      }
      if (d[u][v] < INF) {
        f[u][v] = mp(profit, d[u][v]);
      } else {
        f[u][v] = mp(0, INF);
      }
      // cout << u << " " << v << " " << f[u][v].first << " " << f[u][v].second << "\n";
    }
  }

  i64 profit = 0;
  for (int k = 1; k <= N; k ++) {
    for (int u = 1; u <= N; u ++) {
      for (int v = 1; v <= N; v ++) {
        if (f[u][k].second < INF && f[k][v].second < INF) {
          pair<i64, i64> cur = mp(f[u][k].first + f[k][v].first, f[u][k].second + f[k][v].second);
          // cout << u << " " << v << " " << f[u][v].first << " " << f[u][v].second << "\n";
          Maximize(f[u][v], cur);
        }
      }
    }
  }
  for (int u = 1; u <= N; u ++) {
    for (int v = 1; v <= N; v ++) {
      if (u != v) {
        pair<i64, i64> cur = mp(f[u][v].first + f[v][u].first, f[u][v].second + f[v][u].second);
        if (cur.second != 0) {
          profit = max(profit, cur.first / cur.second);
        }        
      }
    }
  }
  cout << profit << "\n";
}
signed main() {
  ios_base::sync_with_stdio(false); cin.tie(0);
  cout << fixed << setprecision(10);
  int Tests = 1; // cin >> Tests; 
  while (Tests --) {
    Solve();    
  }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...