Cod sursa(job #1969710)

Utilizator ZeBuGgErCasapu Andreas ZeBuGgEr Data 18 aprilie 2017 16:45:00
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>

using namespace std;

const int NMAX = 1000;
const int MMAX = 5000;
const int INF = 2000000000;

int n, m;
int flux[1 + NMAX][1 + NMAX];
vector<int> adj[1 + NMAX];
queue<int> q;
queue<int> final;
int tata[1 + NMAX];

bool pump()
{
  memset(tata, 0, sizeof(tata));
  while(!q.empty())
    q.pop();

  tata[1] = 1;
  q.push(1);

  while(!q.empty())
  {
    int nod = q.front();
    q.pop();

    for(int i = 0; i < adj[nod].size(); i++)
    {
      int fiu = adj[nod][i];
      if(flux[nod][fiu] > 0 && tata[fiu] == 0)
      {
        if(fiu == n) {
          final.push(nod);
        } else {
          tata[fiu] = nod;
          q.push(fiu);
        }
      }
    }
  }

  return !final.empty();
}

int solve()
{
  int answer= 0;

  while(pump())
  {
    while(!final.empty())
    {
      int minim = INF;
      tata[n] = final.front();
      final.pop();

      for (int curr = n; tata[curr] != curr; curr = tata[curr])
        minim = min(minim, flux[tata[curr]][curr]);

      for (int curr = n; tata[curr] != curr; curr = tata[curr])
      {
        flux[tata[curr]][curr] -= minim;
        flux[curr][tata[curr]] += minim;
      }

      answer += minim;
    }
  }

  return answer;
}

int main()
{
  freopen("maxflow.in", "r", stdin);
  freopen("maxflow.out", "w", stdout);

  scanf("%d %d", &n, &m);

  for(int i = 1; i <= m; i++)
  {
    int x, y;
    scanf("%d %d", &x, &y);
    scanf("%d", &flux[x][y]);

    adj[x].push_back(y);
    adj[y].push_back(x);
  }

  printf("%d\n", solve());

  return 0;
}