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

#include <bits/stdc++.h>
using namespace std;

const int INF = 1 << 28;
const int L = 51;

struct Edge {
  int to, cost, rev;
  vector<int> cap;
  Edge(int to, int cost, vector<int> cap, int rev)
      : to(to), cost(cost), cap(cap), rev(rev) {}
  Edge() {}
};

typedef vector<vector<Edge>> Graph;

void addEdgeF(int from, int to, int cost, vector<int> cap, Graph &g) {
  g[from].push_back(Edge(to, cost, cap, g[to].size()));
  g[to].push_back(Edge(from, -cost, vector<int>(L), (int)g[from].size() - 1));
}

inline void add(vector<int> &a, const vector<int> &b) {
  for (int i = 0; i < L; ++i)
    a[i] += b[i];
}

inline void subtract(vector<int> &a, const vector<int> &b) {
  for (int i = 0; i < L; ++i)
    a[i] -= b[i];
}

inline bool lt(const vector<int> &a, const vector<int> &b) {
  for (int i = L - 1; i >= 0; --i)
    if (a[i] != b[i])
      return a[i] < b[i];
  return false;
}

inline bool le(const vector<int> &a, const vector<int> &b) {
  for (int i = L - 1; i >= 0; --i)
    if (a[i] != b[i])
      return a[i] < b[i];
  return true;
}

void show(const vector<int> &ans) {
  if (*max_element(ans.begin(), ans.end()) == 0 &&
      *min_element(ans.begin(), ans.end()) == 0) {
    cout << 0 << endl;
    return;
  }
  for (int i = L - 1, j = 0; i >= 0; --i) {
    if (!ans[i])
      continue;
    if (j) {
      if (ans[i] > 0)
        cout << "+";
      else
        cout << "-";
    } else if (ans[i] < 0)
      cout << "-";
    if (i == 0) {
      cout << abs(ans[i]);
    } else {
      if (abs(ans[i]) != 1)
        cout << abs(ans[i]);
      if (i > 1)
        cout << "x^" << i;
      else if (i == 1)
        cout << "x";
    }
    j++;
  }
  cout << endl;
}

void bfs(int s, vector<int> &level, Graph &g) {
  int n = g.size();
  level = vector<int>(n, -1);
  queue<int> que;
  level[s] = 0;
  que.push(s);
  while (!que.empty()) {
    int v = que.front();
    que.pop();
    for (int i = 0; i < g[v].size(); ++i) {
      const Edge &e = g[v][i];
      if (level[e.to] < 0 && lt(vector<int>(L), e.cap)) {
        level[e.to] = level[v] + 1;
        que.push(e.to);
      }
    }
  }
}

vector<int> dfs(int v, int t, vector<int> f, vector<int> &level,
                vector<int> &iter, Graph &g) {
  if (v == t)
    return f;
  for (int &i = iter[v]; i < g[v].size(); ++i) {
    Edge &e = g[v][i];
    if (level[v] < level[e.to] && lt(vector<int>(L), e.cap)) {
      vector<int> d = dfs(e.to, t, lt(f, e.cap) ? f : e.cap, level, iter, g);
      if (lt(vector<int>(L), d)) {
        subtract(e.cap, d);
        add(g[e.to][e.rev].cap, d);
        return d;
      }
    }
  }
  return vector<int>(L);
}

vector<int> maxFlow(int s, int t, Graph g) {
  vector<int> flow(L);
  while (1) {
    vector<int> level;
    bfs(s, level, g);
    if (level[t] < 0)
      return flow;
    vector<int> iter(g.size());
    vector<int> f;
    while (lt(vector<int>(L),
              f = dfs(s, t, vector<int>(L, INF), level, iter, g))) {
      add(flow, f);
    }
  }
  return flow;
}

int main() {
  for (int N, M; cin >> N >> M && (N | M);) {
    Graph g(N);
    for (int i = 0; i < M; ++i) {
      int u, v;
      cin >> u >> v;
      --u;
      --v;
      string s;
      cin >> s;
      vector<int> cap(L);
      replace(s.begin(), s.end(), '+', ' ');
      stringstream ss(s);
      while (ss >> s) {
        int a = 1;
        {
          int i = 0;
          while (i < s.size() && isdigit(s[i]))
            ++i;
          if (i) {
            a = atoi(s.substr(0, i).c_str());
            s = s.substr(i);
          }
        }
        int k = 0;
        // "" or "x" or "x^y"
        if (s == "x") {
          k = 1;
        } else if (s.size()) {
          k = atoi(s.substr(2).c_str());
        }
        cap[k] = a;
      }
      addEdgeF(u, v, 0, cap, g);
      addEdgeF(v, u, 0, cap, g);
    }
    show(maxFlow(0, N - 1, g));
  }
  return 0;
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;

const int INF = 1 << 28;
const int L = 51;

struct Edge {
  int to, cost, rev;
  vector<int> cap;
  Edge(int to, int cost, vector<int> cap, int rev)
      : to(to), cost(cost), cap(cap), rev(rev) {}
  Edge() {}
};

typedef vector<vector<Edge>> Graph;

void addEdgeF(int from, int to, int cost, vector<int> cap, Graph &g) {
  g[from].push_back(Edge(to, cost, cap, g[to].size()));
  g[to].push_back(Edge(from, -cost, vector<int>(L), (int)g[from].size() - 1));
}

inline void add(vector<int> &a, const vector<int> &b) {
  for (int i = 0; i < L; ++i)
    a[i] += b[i];
}

inline void subtract(vector<int> &a, const vector<int> &b) {
  for (int i = 0; i < L; ++i)
    a[i] -= b[i];
}

inline bool lt(const vector<int> &a, const vector<int> &b) {
  for (int i = L - 1; i >= 0; --i)
    if (a[i] != b[i])
      return a[i] < b[i];
  return false;
}

inline bool le(const vector<int> &a, const vector<int> &b) {
  for (int i = L - 1; i >= 0; --i)
    if (a[i] != b[i])
      return a[i] < b[i];
  return true;
}

void show(const vector<int> &ans) {
  if (*max_element(ans.begin(), ans.end()) == 0 &&
      *min_element(ans.begin(), ans.end()) == 0) {
    cout << 0 << endl;
    return;
  }
  for (int i = L - 1, j = 0; i >= 0; --i) {
    if (!ans[i])
      continue;
    if (j) {
      if (ans[i] > 0)
        cout << "+";
      else
        cout << "-";
    } else if (ans[i] < 0)
      cout << "-";
    if (abs(ans[i]) != 1)
      cout << abs(ans[i]);
    if (i > 1)
      cout << "x^" << i;
    else if (i == 1)
      cout << "x";
    j++;
  }
  cout << endl;
}

vector<int> dfsF(int v, int t, vector<int> f, vector<int> &used, Graph &g) {
  if (v == t)
    return f;
  used[v] = true;
  for (int i = 0; i < g[v].size(); ++i) {
    Edge &e = g[v][i];
    if (!used[e.to] && lt(vector<int>(L), e.cap)) {
      vector<int> d = dfsF(e.to, t, lt(f, e.cap) ? f : e.cap, used, g);
      if (lt(vector<int>(L), d)) {
        subtract(e.cap, d);
        add(g[e.to][e.rev].cap, d);
        return d;
      }
    }
  }
  return vector<int>(L);
}

vector<int> maxFlow(int s, int t, Graph g) {
  vector<int> flow(L);
  vector<int> used(g.size());
  while (1) {
    fill(used.begin(), used.end(), 0);
    vector<int> f = dfsF(s, t, vector<int>(L, INF), used, g);
    if (le(f, vector<int>(L)))
      break;
    add(flow, f);
  }
  return flow;
}

int main() {
  for (int N, M; cin >> N >> M && (N | M);) {
    Graph g(N);
    for (int i = 0; i < M; ++i) {
      int u, v;
      cin >> u >> v;
      --u;
      --v;
      string s;
      cin >> s;
      vector<int> cap(L);
      replace(s.begin(), s.end(), '+', ' ');
      stringstream ss(s);
      while (ss >> s) {
        int a = 1;
        {
          int i = 0;
          while (i < s.size() && isdigit(s[i]))
            ++i;
          if (i) {
            a = atoi(s.substr(0, i).c_str());
            s = s.substr(i);
          }
        }
        int k = 0;
        // "" or "x" or "x^y"
        if (s == "x") {
          k = 1;
        } else if (s.size()) {
          k = atoi(s.substr(2).c_str());
        }
        cap[k] = a;
      }
      addEdgeF(u, v, 0, cap, g);
      addEdgeF(v, u, 0, cap, g);
    }
    show(maxFlow(0, N - 1, g));
  }
  return 0;
}