Cod sursa(job #1916935)

Utilizator stefan_bogdanstefan bogdan stefan_bogdan Data 9 martie 2017 10:42:03
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <iostream>
#include <stdio.h>
#include <vector>
#include <queue>

#define MAXN 1001
#define InFile "maxflow.in"
#define OutFile "maxflow.out"

using namespace std;

int N, M, S, D;
vector<int> G[MAXN];
int C[MAXN][MAXN];
bool Used[MAXN];
int Tata[MAXN];
int iMaxFlow;

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(InFile, "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; /* Sursa */
  D = N; /* Destinatia */
  fclose(f);
}

bool bfs()
{
  for (int i = 1; i <= N; i++) Used[i] = Tata[i] = 0;
  queue<int> Q;
  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++)
    {
      if (!Used[*i] && C[Nod][*i] > 0)
      {
        Tata[*i] = Nod;
        Used[*i] = 1;
        Q.push(*i);
      }
    }
  }
  return Used[D];
}

void MaxFlow(void)
{
  while (bfs())
  {
    for (vector<int>::iterator i = G[D].begin(); i != G[D].end(); i++)
    {
      if (Used[*i] == 1 && C[*i][D] > 0)
      {
        Tata[D] = *i;
        int ValMin = (1 << 30);
        for (int x = D; x != S; x = Tata[x]) ValMin = min(ValMin, C[Tata[x]][x]);
        for (int x = D; x != S; x = Tata[x]) C[Tata[x]][x] -= ValMin, C[x][Tata[x]] += ValMin;
        iMaxFlow += ValMin;
      }
    }
  }
}

void write(void)
{
  FILE * g = fopen(OutFile, "w");
  fprintf(g, "%d", iMaxFlow);
  fclose(g);
}

int main()
{
  read();
  MaxFlow();
  write();
  return 0;
}