Cod sursa(job #966329)

Utilizator crisbodnarCristian Bodnar crisbodnar Data 25 iunie 2013 18:44:39
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <deque>

#define N 1005
#define inf 1 << 30

using namespace std;

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

int n, m, sol, c[N][N], f[N][N];
vector <int> a[N], t(N);
vector <bool> viz(N);
deque <int> q;

bool bfs()
{
    for(int i=1; i<=n; i++) viz[i] = 0;
    q.clear();
    q.push_back(1);
    while(!q.empty() && !viz[n])
    {
        int x = q.front(); q.pop_front();
        for(unsigned i=0; i<a[x].size(); i++)
        {
            int y = a[x][i];
            if(f[x][y] < c[x][y] && !viz[y])
            {
                t[y] = x;
                q.push_back(y);
                viz[y] = 1;
            }
        }
    }
    return viz[n];
}

int main()
{
    fin>>n>>m;
    while(m--)
    {
        int x, y, z;
        fin>>x>>y>>z;
        a[x].push_back(y);
        a[y].push_back(x);
        c[x][y] = z;
    }

    while(bfs())
    {
        for(int k=0; k<a[n].size(); k++)
        {   int i = a[n][k];
            if(f[i][n] < c[i][n])
            {
                int fmin = c[i][n] - f[i][n];
                for(int j=i; j!=1; j=t[j])
                    fmin = min(fmin, c[t[j]][j]-f[t[j]][j]);
                for(int j=i; j!=1; j=t[j])
                {
                    f[t[j]][j] += fmin;
                    f[j][t[j]] -= fmin;
                }
                f[i][n] += fmin;
                f[n][i] -= fmin;
                sol += fmin;
            }
        }
    }
    fout<<sol;
    return 0;
}