제출 #49583

#제출 시각아이디문제언어결과실행 시간메모리
49583model_code여행하는 상인 (APIO17_merchant)C++17
100 / 100
237 ms1792 KiB
#include <iostream>
#include <vector>
#include <climits>

using namespace std;

int N, M, K;
vector<vector<long long>> dist;
vector<vector<long long>> grid;

vector<vector<int>> buy;
vector<vector<int>> sell;

vector<vector<int>> earn;


bool test(long long salary) {
  grid = vector<vector<long long>>(N, vector<long long>(N, LLONG_MAX/2));

  for (int i=0;i<N;i++) {
    for (int j=0;j<N;j++) {
      if (dist[i][j] < LLONG_MAX/2) {
        grid[i][j] = dist[i][j] * salary - earn[i][j];
      }
    }
  }

  for (int k=0;k<N;k++) {
    for (int i=0;i<N;i++) {
      for (int j=0;j<N;j++) {
        grid[i][j] = min(grid[i][j], grid[i][k] + grid[k][j]);
      }
    }
  }

  for (int i=0;i<N;i++) {
    if (grid[i][i] <= 0) return true;
  }
  return false;
}

int bsearch(int mn, int mx) {
  if (mn == mx) return mn;

  int md = (mn+mx+1)/2;

  if (test(md)) {
    return bsearch(md,mx);
  }
  else {
    return bsearch(mn,md-1);
  }
}

int main() {
  cin >> N >> M >> K;

  dist = vector<vector<long long>>(N, vector<long long>(N, LLONG_MAX/2));
  buy = vector<vector<int>>(N, vector<int>(K, -1));
  sell = vector<vector<int>>(N, vector<int>(K, -1));
  earn = vector<vector<int>>(N, vector<int>(N, 0));

  for (int i=0;i<N;i++) {
    //dist[i][i] = 0;
    for (int j=0;j<K;j++) {
      cin >> buy[i][j] >> sell[i][j];
    }
  }

  for (int i=0;i<M;i++) {
    int V, W, T;

    cin >> V >> W >> T;
    V--;
    W--;

    dist[V][W] = min<long long>(dist[V][W], T);
  }

  for (int k=0;k<N;k++) {
    for (int i=0;i<N;i++) {
      for (int j=0;j<N;j++) {
        dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
      }
    }
  }
  
  for (int i=0;i<N;i++) {
    for (int j=0;j<N;j++) {
      for (int k=0;k<K;k++) {
        if (sell[j][k] != -1 && buy[i][k] != -1) {
          earn[i][j] = max(earn[i][j], sell[j][k] - buy[i][k]);
        }
      }
    }
  }

  cout << bsearch(0, 1000000000) << endl;

  
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...