Problem p02361 (C++) — buggy submission, verdict: Time Limit Exceeded

#include "bits/stdc++.h"
#include <cassert>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
#define rep(i, n) for (ll i = 0; i < (ll)(n); i++)
#define all(a) (a).begin(), (a).end()
#define vi vector<int>
#define pb push_back
#define INF 999999999
// #define INF (1LL<<59)

// verified AOJ GRL_1
#define MAX_V 100000
struct edge {
  int to, cost;
};
vector<edge> G[MAX_V];

void dijkstra(int s, vector<int> &d) {
  priority_queue<pii, vector<pii>, greater<pii>> que;
  rep(i, d.size()) d[i] = INF;
  d[s] = 0;
  que.push(pii(0, s));

  while (que.size()) {
    pii p = que.top();
    que.pop();

    int v = p.second;
    if (d[v] < p.first)
      continue;

    rep(i, G[v].size()) {
      edge e = G[v][i];
      if (d[e.to] > d[v] + e.cost) {
        d[e.to] = d[v] + e.cost;
        que.push(pii(d[e.to], e.to));
      }
    }
  }
}

int main() {
  int v, e, s;
  cin >> v >> e >> s;
  rep(i, e) {
    int a, b, c;
    cin >> a >> b >> c;
    G[a].pb(edge{b, c});
  }

  vi d(v);
  dijkstra(s, d);

  rep(i, v) {
    if (d[i] == INF)
      cout << "INF" << endl;
    else
      cout << d[i] << endl;
  }
}


Error: TLE

Fixed submission:

#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <vector>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
#define rep(i, n) for (ll i = 0; i < (ll)(n); i++)
#define all(a) (a).begin(), (a).end()
#define pb push_back
#define INF (1e9 + 1)
// #define INF (1LL<<59)

#define MAX_V 100000
struct edge {
  int to, cap, cost, rev;
};

vector<edge> G[MAX_V];
vector<int> h(MAX_V);           //??????????????£???
vector<int> dist(MAX_V);        // ???????????¢
int prevv[MAX_V], preve[MAX_V]; // ??´??????????????¨???

// from??????to??????????????????cap????????????cost????????????????????????????????????
void add_edge(int from, int to, int cap, int cost) {
  G[from].push_back((edge){to, cap, cost, (int)G[to].size()});
  G[to].push_back((edge){from, 0, -cost, (int)G[from].size() - 1});
}

//?????????????????????????????????????????´????????????
void shortest_path(int s, vector<int> &d) {
  int v = d.size();
  rep(i, d.size()) d[i] = INF;
  d[s] = 0;
  rep(loop, v) {
    rep(i, v) {
      rep(j, G[i].size()) {
        edge e = G[i][j];
        if (!e.cap)
          continue;
        if (d[i] != INF && d[e.to] > d[i] + e.cost) {
          d[e.to] = d[i] + e.cost;
        }
      }
    }
  }
}

// s??????t????????????f???????°??????¨???????±???????
// ??????????????´??????-1?????????
int min_cost_flow(int s, int t, int f) {
  int res = 0;
  shortest_path(s, h);

  while (f > 0) {
    // ?????????????????????????????¨??????h?????´??°??????
    priority_queue<pii, vector<pii>, greater<pii>> que;
    rep(i, dist.size()) dist[i] = INF;
    dist[s] = 0;
    que.push(pii(0, s));
    while (!que.empty()) {
      pii p = que.top();
      que.pop();
      int v = p.second;
      if (dist[v] < p.first)
        continue;
      for (int i = 0; i < G[v].size(); i++) {
        edge &e = G[v][i];
        if (e.cap > 0 && dist[e.to] > dist[v] + e.cost + h[v] - h[e.to]) {
          dist[e.to] = dist[v] + e.cost + h[v] - h[e.to];
          prevv[e.to] = v;
          preve[e.to] = i;
          que.push(pii(dist[e.to], e.to));
        }
      }
    }
    if (dist[t] == INF)
      return -1; //????????\\???????????????

    for (int v = 0; v < h.size(); v++)
      h[v] += dist[v];

    // s-t????????????????????£??????????????????
    int d = f;
    for (int v = t; v != s; v = prevv[v]) {
      d = min(d, G[prevv[v]][preve[v]].cap);
    }
    f -= d;
    res += d * h[t];
    for (int v = t; v != s; v = prevv[v]) {
      edge &e = G[prevv[v]][preve[v]];
      e.cap -= d;
      G[v][e.rev].cap += d;
    }
  }
  return res;
}

int main() {
  int v, e, s;
  cin >> v >> e >> s;
  rep(i, e) {
    int s, t, d;
    cin >> s >> t >> d;
    add_edge(s, t, 1, d);
  }
  vector<edge> Gr[MAX_V];
  rep(i, MAX_V) Gr[i] = G[i];
  rep(i, v) {
    rep(j, MAX_V) G[j] = Gr[j];
    int res = min_cost_flow(s, i, 1);
    if (res == -1)
      cout << "INF" << endl;
    else
      cout << res << endl;
  }
}