제출 #1117207

#제출 시각아이디문제언어결과실행 시간메모리
1117207ThegeekKnight16여행하는 상인 (APIO17_merchant)C++17
100 / 100
80 ms4344 KiB
#include <bits/stdc++.h> using namespace std; #define int long long const int INF = 1e9 + 10; bool bellman(int x, const vector<vector<int>> &preco, const vector<vector<int>> &tempo, const int &N) { vector<vector<int>> p(N+1, vector<int>(N+1)); for (int i = 1; i <= N; i++) for (int j = 1; j <= N; j++) p[i][j] = x * tempo[i][j] - preco[i][j]; for (int i = 1; i <= N; i++) p[i][i] = INF; vector<int> dist(N+1, 0); for (int t = 1; t <= N+1; t++) for (int i = 1; i <= N; i++) for (int j = 1; j <= N; j++) dist[j] = min(dist[j], dist[i] + p[i][j]); for (int i = 1; i <= N; i++) for (int j = 1; j <= N; j++) if (dist[j] > dist[i] + p[i][j]) return true; vector<vector<int>> grafo(N+1); vector<int> grau(N+1); for (int i = 1; i <= N; i++) for (int j = 1; j <= N; j++) if (dist[j] == dist[i] + p[i][j]) grafo[i].push_back(j), grau[j]++; queue<int> q; for (int i = 1; i <= N; i++) if (grau[i] == 0) q.push(i); while (!q.empty()) { int cur = q.front(); q.pop(); for (auto viz : grafo[cur]) if (--grau[viz] == 0) q.push(viz); } return *max_element(grau.begin(), grau.end()); } int32_t main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int N, M, K; cin >> N >> M >> K; vector<vector<pair<int, int>>> items(N+1, vector<pair<int, int>>(K)); for (int i = 1; i <= N; i++) for (auto &[B, S] : items[i]) cin >> B >> S; vector<vector<int>> preco(N+1, vector<int>(N+1, 0)); for (int i = 1; i <= N; i++) for (int j = 1; j <= N; j++) for (int k = 0; k < K; k++) { auto [Bi, Si] = items[i][k]; auto [Bj, Sj] = items[j][k]; if (Bi == -1 || Sj == -1) continue; if (Bi >= Sj) continue; preco[i][j] = max(preco[i][j], Sj - Bi); } vector<vector<int>> tempo(N+1, vector<int>(N+1, INF)); for (int i = 1; i <= M; i++) { int X, Y, P; cin >> X >> Y >> P; tempo[X][Y] = min(tempo[X][Y], P); } for (int i = 1; i <= N; i++) tempo[i][i] = 0; for (int k = 1; k <= N; k++) for (int i = 1; i <= N; i++) for (int j = 1; j <= N; j++) tempo[i][j] = min(tempo[i][j], tempo[i][k] + tempo[k][j]); int ini = 0, fim = INF; while (ini < fim) { int m = (ini + fim + 1) >> 1; if (bellman(m, preco, tempo, N)) ini = m; else fim = m-1; } cout << fim << '\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...