Cod sursa(job #1685728)

Utilizator sorynsooSorin Soo sorynsoo Data 11 aprilie 2016 20:23:17
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
#define MAXN 1005
#define INF 0x3f3f3f3f

ifstream cin("maxflow.in");
ofstream cout("maxflow.out");

queue<int> coada;
vector<int> graf[MAXN];
int capacitate[MAXN][MAXN], tata[MAXN];
int n,m, flux_total;

bool bfs(int st, int fin)
{
    int i, urm, crt;
    while(!coada.empty())
        coada.pop();

    for(i=1; i<=n; i++)
        tata[i] = 0;

    tata[st] = -1;   coada.push(st);
    while(!coada.empty())
    {
        crt = coada.front(); coada.pop();

        if(crt == fin)
            return 1;

        for(i=0; i<graf[crt].size(); i++)
        {
            urm = graf[crt][i];
            if(!tata[urm] && capacitate[crt][urm] > 0)
            {
                tata[urm] = crt;
                coada.push(urm);
            }
        }
    }

    return 0;
}
int main()
{
    int i, j, x, y, z, ant, flux_crt;
    cin>>n>>m;
    for(i=1; i<=m; i++)
    {
        cin>>x>>y>>z;
        graf[x].push_back(y);
        graf[y].push_back(x);
        capacitate[x][y]=z;
    }

    while(bfs(1, n))
    {
        for(i=0; i<graf[n].size(); i++)
        {
            ant = graf[n][i];
            if(tata[ant] && capacitate[ant][n] > 0 )
            {
                tata[n] = ant;
                flux_crt = INF;

                for(j=n; j!=1; j=tata[j])
                    flux_crt = min(flux_crt, capacitate[ tata[j] ][ j ]);

                if(flux_crt)
                {
                    for(j=n; j!=1; j=tata[j])
                    {
                        capacitate[ tata[j] ][ j ] -= flux_crt;
                        capacitate[ j ][ tata[j] ] += flux_crt;
                    }

                    flux_total += flux_crt;
                }
            }
        }
    }

    cout<<flux_total;
    return 0;
}