Cod sursa(job #563158)

Utilizator dacyanMujdar Dacian dacyan Data 24 martie 2011 16:44:41
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <iostream>
#include <fstream>
#define DIM 1001
#define INF 0x3f3f3f3f
using namespace std;

int n, m;
int start, dest;
long flux;

int f[DIM][DIM];
int c[DIM][DIM];
vector<int> cr, t;

int nr;

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


void Read();
void EK();
void Augmentation();
bool BF();
void Write();

int main()
{
    Read();
    EK();
    Write();
    return 0;
}

void Read()
{
   
    fin >> n >> m;
    start = 1; dest = n;
    int x, y, fl;
    for (int i = 1; i <= m; ++i)
    {
        fin >> x >> y >> fl;
        c[x][y] = fl;
    }
    fin.close();
}

void EK()
{
    while (BF())
        Augmentation();
}

bool BF()
{
    queue<int> Q;
    vector<bool> s(n + 1);
   // cr.assign(n + 1, 0);
    cr.clear(); cr.resize(n+1);
    t.assign(n+1, 0);
    cr[start] = INF;
    s[start] = 1;
    Q.push(start);
    while (!Q.empty())
    {
        int i = Q.front();
        Q.pop();
        for (int j = 1; j <= n; ++j)
        {
            if (s[j]) continue;
            if (c[i][j] > f[i][j])
            {
                cr[j] = min(cr[i], c[i][j] - f[i][j]);
                t[j] = i;
                s[j] = true;
                Q.push(j);
               if (j == dest) return true;
            }
        }

    }
    return false;
}

void Augmentation()
{
    int i, j;
    j = dest;
    while (j != start)
    {
        i = t[j];
        f[i][j] += cr[dest];
        f[j][i] -= cr[dest];
        j = i;
    }
    flux += cr[dest];
  

}

void Write()
{
    fout << flux << '\n';
  /*  for (int i = 1; i <= n; ++i)
    {
        for (int j = 1; j <= n; ++j)
            fout << f[i][j] << ' ';
        fout << '\n';
    }
    fout.close(); */
}