Dang_Quan_10_Tin

merchant

Oct 15th, 2020
311
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.87 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #define task ""
  4.  
  5. using namespace std;
  6. using ll = long long;
  7. using ld = long double;
  8.  
  9. const int N = 1e3 + 2;
  10. int n, m, k;
  11. ll buy[102][N], sell[102][N];
  12. ll a[102][102];
  13. ll best[102][102];
  14. const ll Inf = 1e11;
  15. ll d[N][N];
  16.  
  17. void Read()
  18. {
  19.     cin >> n >> m >> k;
  20.     for (int i = 1; i <= n; ++i)
  21.         for (int j = 1; j <= k; ++j)
  22.             cin >> buy[i][j] >> sell[i][j];
  23.     fill_n(&a[0][0], 102 * 102, Inf);
  24.     for (int i = 1; i <= m; ++i)
  25.     {
  26.         int u, v;
  27.         ll w;
  28.         cin >> u >> v >> w;
  29.         a[u][v] = min(a[u][v], w);
  30.     }
  31. }
  32.  
  33. bool Check(ll x)
  34. {
  35.     for (int i = 1; i <= n; i++)
  36.         for (int j = 1; j <= n; j++)
  37.             if (i == j)
  38.                 d[i][j] = 0;
  39.             else
  40.                 d[i][j] = a[i][j] == Inf ? Inf : (a[i][j] * x - best[i][j]),
  41.                 d[i][j] = min(d[i][j], Inf);
  42.     for (int k = 1; k <= n; ++k)
  43.         for (int u = 1; u <= n; ++u)
  44.             for (int v = 1; v <= n; ++v)
  45.                 d[u][v] = min(d[u][v], d[u][k] == Inf || d[k][v] == Inf ? Inf : (d[u][k] + d[k][v])),
  46.                 d[u][v] = min(d[u][v], Inf);
  47.     //cout << x << ":\n";
  48.     //for (int u = 1; u <= n; ++u)
  49.     //    for (int v = 1; v <= n; ++v)
  50.     //        cout << d[u][v] << (v == n ? "\n" : " ");
  51.     for (int i = 1; i <= n; ++i)
  52.         for (int j = 1; j <= n; ++j)
  53.             if (i != j && (d[j][i] == Inf || a[i][j] == Inf ? Inf : (d[j][i] + a[i][j] * x - best[i][j])) <= 0ll)
  54.             {
  55.                 //cout << i << " " << j << " " << a[i][j] * x << " " << (d[j][i] == Inf || a[i][j] == Inf ? Inf : (d[j][i] + a[i][j] * x - best[i][j])) << "\n";
  56.                 return true;
  57.             }
  58.     return false;
  59. }
  60.  
  61. void Solve()
  62. {
  63.     for (int u = 1; u <= n; ++u)
  64.         a[u][u] = 0;
  65.     for (int k = 1; k <= n; ++k)
  66.         for (int u = 1; u <= n; ++u)
  67.             for (int v = 1; v <= n; ++v)
  68.                 a[u][v] = min(a[u][v], a[u][k] + a[k][v]);
  69.     for (int i = 1; i <= n; ++i)
  70.         for (int j = 1; j <= n; ++j)
  71.         {
  72.             best[i][j] = 0;
  73.             if (i != j)
  74.                 for (int t = 1; t <= k; ++t)
  75.                     if (buy[i][t] != -1 && sell[j][t] != -1)
  76.                         best[i][j] = max(best[i][j], sell[j][t] - buy[i][t]);
  77.         }
  78.     //for (int i = 1; i <= n; ++i)
  79.     //    for (int j = 1; j <= n; ++j)
  80.     //        cout << best[i][j] << (j == n ? "\n" : " ");
  81.     ll l = 0, m, h = 1e9;
  82.     while (l <= h)
  83.     {
  84.         m = (l + h) / 2;
  85.         if (Check(m))
  86.             l = m + 1;
  87.         else
  88.             h = m - 1;
  89.     }
  90.     cout << h;
  91. }
  92.  
  93. int32_t main()
  94. {
  95.     ios_base::sync_with_stdio(0);
  96.     cin.tie(0);
  97.     cout.tie(0);
  98.     if (fopen(task ".INP", "r"))
  99.     {
  100.         freopen(task ".INP", "r", stdin);
  101.         freopen(task ".OUT", "w", stdout);
  102.     }
  103.     Read();
  104.     Solve();
  105. }
  106.  
Advertisement
Add Comment
Please, Sign In to add comment