This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int INF = 1e9 + 10;
bool cycle_zero(int v, vector<int> &Marc, const vector<int> &dist, const vector<vector<int>> &p, const int &N)
{
Marc[v] = 1;
for (int j = 1; j <= N; j++)
{
if (v == j || dist[j] != dist[v] + p[v][j]) continue;
if (Marc[j] || cycle_zero(j, Marc, dist, p, N)) return true;
}
return false;
}
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];
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<int> Marc(N+1);
for (int i = 1; i <= N; i++)
{
if (Marc[i]) continue;
if (cycle_zero(i, Marc, dist, p, N)) return true;
}
return false;
}
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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |