Cod sursa(job #1969688)

Utilizator ZeBuGgErCasapu Andreas ZeBuGgEr Data 18 aprilie 2017 16:32:19
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 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;
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)
      {
        tata[fiu] = nod;
        if(fiu == n)
          return true;
        else
          q.push(fiu);
      }
    }
  }
  return false;
}

int solve()
{
  int answer= 0;

  while(pump())
  {
    int minim = INF;
    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;
}