| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 1311881 | HasanV11010238 | 여행하는 상인 (APIO17_merchant) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define INF 1000000000
#define INF2 1000000000005
int main(){
ll n, m, k, x, y, co;
cin>>n>>m>>k;
vector<vector<ll>> b(n + 1, vector<ll>(k + 1, -1)), s(n + 1, vector<ll>(k + 1, -1));
for (int i = 1; i <= n; i++){
for (int j = 1; j <= k; j++){
cin>>b[i][j]>>s[i][j];
}
}
vector<vector<ll>> di(n + 1, vector<ll>(n + 1, INF)), pr(n + 1, vector<ll>(n + 1, 0));
for (int i = 1; i <= m; i++){
cin>>x>>y>>co;
di[x][y] = min(di[x][y], co);
}
for (int i = 1; i <= n; i++) di[i][i] = 0;
for (int l = 1; l <= n; l++){
for (int i = 1; i <= n; i++){
for (int j = 1; j <= n; j++){
di[i][j] = min(di[i][j], di[i][l] + di[l][j]);
}
}
}
for (int i = 1; i <= n; i++){
for (int j = 1; j <= n; j++){
for (int l = 1; l <= k; l++){
if (b[i][l] != -1 && s[j][l] != -1) pr[i][j] = max(pr[i][j], s[j][l] - b[i][l]);
}
}
}
ll l = 1, r = 1000000000, best = 0;
while (l <= r){
ll mid = (l + r) / 2;
vector<vector<ll>> dp(n + 1, vector<ll>(n + 1, INF));
for (int i = 1; i <= n; i++){
dp[i][i] = 0;
for (int j = 1; j <= n; j++){
dp[i][j] = min(mid * di[i][j], INF2) - pr[i][j];
}
}
for (int z = 1; z <= n; z++){
for (int i = 1; i <= n; i++){
for (int j = 1; j <= n; j++){
dp[i][j] = min(dp[i][j], dp[i][z] + dp[z][j]);
}
}
}
bool can = 0;
for (int i = 1; i <= n; i++){
for (int j = 1; j <= n; j++){
if (i == j) continue;
if (dp[i][j] + dp[j][i] <= 0) can = 1;
}
}
if (can == 1){
best = mid;
l = mid + 1;
}
else{
r = mid - 1;
}
}
cout<<best;
}
