Submission #897843

#TimeUsernameProblemLanguageResultExecution timeMemory
897843avighnaOlympic Bus (JOI20_ho_t4)C++17
0 / 100
1063 ms10568 KiB
#include <bits/stdc++.h>

using namespace std;

#define ll long long

const ll N = 201, M = 50001;

ll n, m;
// first -> distance, second -> length
vector<pair<ll, ll>> dist[N][N];
vector<ll> edges_cnt[N][N];

vector<pair<ll, ll>> adj[N];
ll c[M], d[M];
pair<ll, ll> edges[M];

void insert_dist(ll i, ll j, ll d, ll l) {
  dist[i][j].push_back({d, l});
  sort(dist[i][j].begin(), dist[i][j].end());
  while (dist[i][j].size() > 2) {
    dist[i][j].pop_back();
  }
}

ll get_dist(ll u, ll v) { return dist[u][v][0].first; }

ll get_rdist(ll a, ll b, ll i) {
  // we can't use edge number i
  pair<ll, ll> p = {a, b};
  if (edges[i] != p) {
    return dist[a][b][0].first;
  }
  ll ans = 1e15;
  bool dup_exists = false;
  for (auto &e : edges_cnt[a][b]) {
    if (e == i) {
      continue;
    }
    if (c[e] == c[i]) {
      dup_exists = true;
    }
    ans = min(ans, c[e]);
  }
  for (ll i = 0; i < dist[a][b].size(); ++i) {
    if (dist[a][b][i].second != 1) {
      ans = min(ans, dist[a][b][i].first);
      continue;
    }
    if (!dup_exists && dist[a][b][i].first == c[i]) {
      continue;
    }
    ans = min(ans, dist[a][b][i].first);
  }
  return ans;
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);

  cin >> n >> m;
  for (ll i = 1; i <= n; ++i) {
    adj[i].clear();
  }
  for (ll i = 1; i <= n; ++i) {
    for (ll j = 1; j <= n; ++j) {
      insert_dist(i, j, 1e15, 0);
    }
  }
  for (ll i = 1; i <= n; ++i) {
    insert_dist(i, i, 0, 0);
  }
  for (ll i = 0, u, v; i < m; ++i) {
    cin >> u >> v >> c[i] >> d[i];
    adj[u].emplace_back(v, i);
    edges[i] = {u, v};
    edges_cnt[u][v].push_back(i);
    insert_dist(u, v, c[i], 1);
  }

  for (ll a = 1; a <= n; ++a) {
    for (ll b = 1; b <= n; ++b) {
      for (ll c = 1; c <= n; ++c) {
        insert_dist(a, c, dist[a][b][0].first + dist[b][c][0].first,
                    dist[a][b][0].second + dist[b][c][0].second);
      }
    }
  }

  set<ll> edges_to, edges_from;
  if (get_dist(1, n) != (ll)1e15) {
    for (ll node = 1; node != n;) {
      for (auto &nb : adj[node]) {
        if (c[nb.second] + get_dist(nb.first, n) == get_dist(node, n)) {
          edges_to.insert(nb.second);
          node = nb.first;
        }
      }
    }
  }
  if (get_dist(n, 1) != (ll)1e15) {
    for (ll node = n; node != 1;) {
      for (auto &nb : adj[node]) {
        if (c[nb.second] + get_dist(nb.first, 1) == get_dist(node, 1)) {
          edges_from.insert(nb.second);
          node = nb.first;
        }
      }
    }
  }

  ll ans = min((ll)1e15, get_dist(1, n) + get_dist(n, 1));
  for (ll i = 0; i < m; ++i) {
    ll u = edges[i].first, v = edges[i].second;
    ll _ans = d[i];
    if (edges_to.count(i)) {
      _ans += get_rdist(1, v, i) + c[i] + get_rdist(u, n, i);
    } else {
      _ans +=
          min(get_dist(1, n), get_rdist(1, v, i) + c[i] + get_rdist(u, n, i));
    }
    if (edges_from.count(i)) {
      _ans += get_rdist(n, v, i) + c[i] + get_rdist(u, 1, i);
    } else {
      _ans +=
          min(get_dist(n, 1), get_rdist(n, v, i) + c[i] + get_rdist(u, 1, i));
    }
    ans = min(ans, _ans);
  }
  if (ans == (ll)1e15) {
    ans = -1;
  }
  cout << ans << "\n";
}

Compilation message (stderr)

ho_t4.cpp: In function 'long long int get_rdist(long long int, long long int, long long int)':
ho_t4.cpp:45:20: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   45 |   for (ll i = 0; i < dist[a][b].size(); ++i) {
      |                  ~~^~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...