Cod sursa(job #1048075)

Utilizator cahemanCasian Patrascanu caheman Data 5 decembrie 2013 11:21:29
Problema Flux maxim Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>

using namespace std;

int costs[1005][1005], tasu[1005], q[1005];

vector <int> v[1005];

void bfs(int s, int t)
{
  int start = 0, avans = 0, aux, aux2, i;
  q[++ avans] = s;
  tasu[s] = -2;
  while(avans >= start && tasu[t] == -1)
  {
    for(aux = q[++ start], i = 0; i < v[aux].size(); ++ i)
    {
      aux2 = v[aux][i];
      if(tasu[aux2] == -1 && costs[aux][aux2])
      {
        q[++ avans] = aux2;
        tasu[aux2] = aux;
      }
    }
  }
}

int rez(int n, int s, int t)
{
  int flow = 0, aux, cmin, aux2, aux3;
  while(1)
  {
    memset(tasu, -1, sizeof(tasu));
    bfs(s, t);
    if(tasu[t] == -1)
      break;
    for(aux = 1; aux <= n; ++ aux)
      if(costs[aux][t] && tasu[aux] != -1)
      {
        cmin = costs[aux][t];
        for(aux2 = aux, aux3 = tasu[aux2]; aux3 > 0; aux2 = aux3, aux3 = tasu[aux2])
          cmin = min(cmin, costs[aux3][aux2]);
        if(cmin)
        {
          costs[aux][t] -= cmin;
          costs[t][aux] += cmin;
          for(aux2 = aux, aux3 = tasu[aux2]; aux3 >= 0; aux2 = aux3, aux3 = tasu[aux2])
          {
            costs[aux3][aux2] -= cmin;
            costs[aux2][aux3] += cmin;
          }
          flow += cmin;
        }
      }
  }
  return flow;
}

int main()
{
  freopen("maxflow.in", "r", stdin);
  freopen("maxflow.out", "w", stdout);
  int n, s, t, m, i, x, y, c;
  scanf("%d%d", &n, &m);
  s = 1, t = n;
  for(i = 1; i <= m; i++)
  {
    scanf("%d%d%d", &x, &y, &c);
    costs[x][y] += c;
    v[x].push_back(y);
    v[y].push_back(x);
  }
  printf("%d", rez(n, s, t));
  return 0;
}