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

#include <bits/stdc++.h>
using namespace std;
struct edge {
  int to, cap, rev;
};
#define MAX 52
#define INF (1e7)
int n;
vector<int> G[MAX][MAX];
bool used[MAX];
vector<int> g[MAX];
vector<int> min(vector<int> &a, vector<int> &b) {
  for (int i = MAX - 1; i >= 0; i--) {
    if (a[i] == b[i])
      continue;
    if (a[i] > b[i])
      return b;
    if (a[i] < b[i])
      return a;
  }
  return a;
}

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

void sub(vector<int> &a, vector<int> b) {
  for (int i = 0; i < MAX; i++)
    a[i] -= b[i];
}

bool check(vector<int> &a) {
  for (int i = 0; i < MAX; i++)
    if (a[i] > 0)
      return true;
  return false;
}

vector<int> dfs(int v, int t, vector<int> f) {
  if (v == t)
    return f;
  used[v] = true;
  for (int to = 0; to < g[v].size(); to++) {
    int i = g[v][to];
    vector<int> &e = G[v][i];
    if (!used[i] && check(e)) {
      vector<int> d = dfs(i, t, min(f, e));
      if (d.size() == MAX && check(d)) {
        sub(G[v][i], d);
        add(G[i][v], d);
        return d;
      }
    }
  }
  return vector<int>();
}

vector<int> max_flow(int s, int t) {
  vector<int> flow(MAX, 0);
  while (1) {
    memset(used, 0, sizeof(used));
    vector<int> tmp(MAX, INF);
    vector<int> f = dfs(s, t, tmp);
    if (f.size() == 0)
      return flow;
    add(flow, f);
  }
  return flow;
}

int m;
int t[MAX][MAX][MAX];
int u[MAX][MAX];

int s2i(string s) {
  stringstream ss;
  int res;
  ss << s;
  ss >> res;
  return res;
}

void func(int a, int b, string &tmp) {
  int len = tmp.size();
  int flg = 0;
  for (int i = 0; i < len; i++) {
    if ('0' <= tmp[i] && tmp[i] <= '9')
      continue;
    flg = 1;
  }
  if (flg == 0) {
    t[a][b][0] = t[b][a][0] = s2i(tmp);
    return;
  }

  int v, w;
  if (tmp[0] == 'x')
    v = 1;
  else {
    for (int i = 0; i < len; i++) {
      if (tmp[i] == 'x') {
        v = s2i(tmp.substr(0, i));
        break;
      }
    }
  }

  if (tmp[len - 1] == 'x')
    w = 1;
  else {
    for (int i = 0; i < len; i++) {
      if (tmp[i] == '^') {
        w = s2i(tmp.substr(i + 1));
        break;
      }
    }
  }
  t[a][b][w] = t[b][a][w] = v;
}

int main() {
  while (1) {
    cin >> n >> m;
    if (n == 0 && m == 0)
      break;
    memset(t, 0, sizeof(t));
    memset(u, 0, sizeof(u));
    for (int i = 0; i < MAX; i++)
      g[i].clear();

    for (int i = 0; i < m; i++) {
      int a, b;
      string s, tmp;
      cin >> a >> b >> s;
      g[a].push_back(b);
      g[b].push_back(a);
      for (int j = 0; j < (int)s.size(); j++)
        if (s[j] == '+')
          s[j] = ' ';
      stringstream ss(s);
      while (ss >> tmp) {
        func(a, b, tmp);
      }
    }

    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= n; j++) {
        G[i][j].clear();
        G[i][j].resize(MAX);
        for (int k = 0; k < MAX; k++) {
          G[i][j][k] = t[i][j][k];
        }
      }
    }

    vector<int> ans = max_flow(1, n);
    bool cnt = 0;
    for (int i = MAX - 1; i >= 0; i--) {
      if (ans[i] == 0)
        continue;
      if (cnt > 0)
        cout << '+';
      cnt++;
      if (i == 0 || ans[i] > 1)
        cout << ans[i];
      if (i)
        cout << 'x';
      if (i > 1)
        cout << "^" << i;
    }
    if (cnt == 0)
      cout << 0;
    cout << endl;
  }
  return 0;
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
struct edge {
  int to, cap, rev;
};
#define MAX 51
#define INF (1e7)
int n;
vector<int> G[MAX][MAX];
bool used[MAX];

vector<int> min(vector<int> &a, vector<int> &b) {
  for (int i = MAX - 1; i >= 0; i--) {
    if (a[i] == b[i])
      continue;
    if (a[i] > b[i])
      return b;
    if (a[i] < b[i])
      return a;
  }
  return a;
}

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

void sub(vector<int> &a, vector<int> b) {
  for (int i = 0; i < MAX; i++)
    a[i] -= b[i];
}

bool check(vector<int> &a) {
  for (int i = 0; i < MAX; i++)
    if (a[i] > 0)
      return true;
  return false;
}

vector<int> dfs(int v, int t, vector<int> f) {
  if (v == t)
    return f;
  used[v] = true;
  for (int i = 1; i <= n; i++) {
    vector<int> &e = G[v][i];
    if (!used[i] && check(e)) {
      vector<int> d = dfs(i, t, min(f, e));
      if (d.size() == MAX && check(d)) {
        sub(G[v][i], d);
        add(G[i][v], d);
        return d;
      }
    }
  }
  return vector<int>();
}

vector<int> max_flow(int s, int t) {
  vector<int> flow(MAX, 0);
  while (1) {
    memset(used, 0, sizeof(used));
    vector<int> tmp(MAX, INF);
    vector<int> f = dfs(s, t, tmp);
    if (f.size() == 0)
      return flow;
    add(flow, f);
  }
  return flow;
}

int m;
int t[MAX][MAX][MAX];
int u[MAX][MAX];

int s2i(string s) {
  stringstream ss;
  int res;
  ss << s;
  ss >> res;
  return res;
}

void func(int a, int b, string &tmp) {
  int len = tmp.size();
  int flg = 0;
  for (int i = 0; i < len; i++) {
    if ('0' <= tmp[i] && tmp[i] <= '9')
      continue;
    flg = 1;
  }
  if (flg == 0) {
    t[a][b][0] = t[b][a][0] = s2i(tmp);
    return;
  }

  int v, w;
  if (tmp[0] == 'x')
    v = 1;
  else {
    for (int i = 0; i < len; i++) {
      if (tmp[i] == 'x') {
        v = s2i(tmp.substr(0, i));
        break;
      }
    }
  }

  if (tmp[len - 1] == 'x')
    w = 1;
  else {
    for (int i = 0; i < len; i++) {
      if (tmp[i] == '^') {
        w = s2i(tmp.substr(i + 1));
        break;
      }
    }
  }
  t[a][b][w] = t[b][a][w] = v;
}

int main() {
  while (1) {
    cin >> n >> m;
    if (n == 0 && m == 0)
      break;
    memset(t, 0, sizeof(t));
    memset(u, 0, sizeof(u));
    for (int i = 0; i < m; i++) {
      int a, b;
      string s, tmp;
      cin >> a >> b >> s;
      for (int j = 0; j < (int)s.size(); j++)
        if (s[j] == '+')
          s[j] = ' ';
      stringstream ss(s);
      while (ss >> tmp) {
        func(a, b, tmp);
      }
    }

    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= n; j++) {
        G[i][j].clear();
        G[i][j].resize(MAX);
        for (int k = 0; k < MAX; k++) {
          G[i][j][k] = t[i][j][k];
        }
      }
    }

    vector<int> ans = max_flow(1, n);
    bool cnt = 0;
    for (int i = MAX - 1; i >= 0; i--) {
      if (ans[i] == 0)
        continue;
      if (cnt > 0)
        cout << '+';
      cnt++;
      if (i == 0 || ans[i] > 1)
        cout << ans[i];
      if (i)
        cout << 'x';
      if (i > 1)
        cout << "^" << i;
    }
    if (cnt == 0)
      cout << 0;
    cout << endl;
  }
  return 0;
}