Cod sursa(job #1833088)

Utilizator tqmiSzasz Tamas tqmi Data 21 decembrie 2016 16:55:10
Problema Flux maxim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

const int NMax = 1005;
const int oo = 2000000000;

vector <int> G[NMax];
queue <int> Q;
int N,M,Flux;
int TT[NMax],Use[NMax];
int C[NMax][NMax],F[NMax][NMax];

void Read()
{
  fin >> N >> M;
  for(int i = 1; i <= M; ++i)
    {
      int x,y,z;
      fin >> x >> y >> z;
      G[x].push_back(y);
      G[y].push_back(x);
      C[x][y] = z;
      C[y][x] = 0;
    }
}

int BFS()
{
  memset(Use,0,sizeof(Use));
  Q.push(1);
  while(!Q.empty())
    {
      int Nod = Q.front(); Q.pop();
      if(Nod == N)
        continue;
      for(int i = 0; i < (int)G[Nod].size(); ++i)
        {
          int Vecin = G[Nod][i];
          if(C[Nod][Vecin] - F[Nod][Vecin] == 0 || Use[Vecin] == 1) continue;
          Use[Vecin] = 1;
          TT[Vecin] = Nod;
          Q.push(Vecin);
        }
    }
  return Use[N];
}

void Solve()
{
  while(BFS())
    {
      int Min = oo;
        for(int Nod = N; Nod != 1; Nod = TT[Nod])
            Min = min(Min,C[TT[Nod]][Nod] - F[TT[Nod]][Nod]);
        Flux += Min;
        for(int Nod = N; Nod != 1; Nod = TT[Nod])
            {
              F[TT[Nod]][Nod] += Min;
              F[Nod][TT[Nod]] -= Min;
            }
    }
}

void Print()
{
  fout << Flux << "\n";
}

int main()
{
    Read();
    Solve();
    Print();
    return 0;
}