Cod sursa(job #1891824)

Utilizator stefan_bogdanstefan bogdan stefan_bogdan Data 24 februarie 2017 12:50:25
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>
#include <vector>

#define MAXN 1001
#define MAX (1<<31)-1

using namespace std;

int n, m, s, d, flux;
int used[MAXN];
int tata[MAXN];
int C[MAXN][MAXN];

vector<int> G[MAXN];
queue<int> Q;

inline void add(int x, int y, int z)
{
  G[x].push_back(y);
  G[y].push_back(x);
  C[x][y] = z;
}

void read(void)
{
  FILE *f = fopen("maxflow.in", "r");

  fscanf(f, "%d %d", &n, &m);

  for (int i = 1, x, y, z; i <= m; i++)
  {
    fscanf(f, "%d %d %d", &x, &y, &z);
    add(x, y, z);
  }
  s = 1;
  d = n;
  fclose(f);
}

inline bool bfs()
{
  memset(used, 0, sizeof(used));

  Q.push(s);
  used[s] = 1;

  while (!Q.empty())
  {
    int nod = Q.front();
    Q.pop();
    if (nod == d) continue;
    for (vector<int>::iterator i = G[nod].begin(); i != G[nod].end(); i++)
    {
      int fiu = *i;
      if (C[nod][fiu] > 0 && used[fiu] == 0)
      {
        tata[fiu] = nod;
        used[fiu] = 1;
        Q.push(fiu);
      }
    }
  }
  return used[d];
}

void solve()
{
  while(bfs())
  {
    for (vector<int>::iterator i = G[d].begin(); i != G[d].end(); i++)
    {
      int fiu = *i;
      if (C[fiu][d] > 0 && used[fiu] != 0)
      {
        tata[d] = fiu;
        int Min = MAX;

        for (int k = d; k != s; k = tata[k])
        {
          Min = min(Min, C[tata[k]][k]);
        }
        for (int k = d; k != s; k = tata[k])
        {
          C[tata[k]][k] -= Min;
          C[k][tata[k]] += Min;
        }
        flux += Min;
      }
    }
  }
}

void write(void)
{
  FILE * g = fopen("maxflow.out", "w");
  fprintf(g, "%d", flux);
  fclose(g);
}

int main()
{
  read();
  solve();
  write();
}