Cod sursa(job #1262836)

Utilizator stefan.friptuPetru Stefan Friptu stefan.friptu Data 13 noiembrie 2014 16:35:53
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
const int Nmax = 1005;
vector <int> v[Nmax];
int c [Nmax][Nmax], f [Nmax][Nmax];
bool viz[Nmax];
int pred[Nmax];
bool bfs( int start, int finish )
{
    int i, x;
    queue <int> q;
    q.push(start);
    viz [start]=1;
    while(!q.empty())
    {
        x = q.front();

        for(i = 0; i< v[x].size(); i++)
        {
            if(!viz[v[x][i]] && c[x][v[x][i]] - f[x][v[x][i]] > 0)
            {
                pred[v[x][i]] = x;
                viz[v[x][i]] = true;
                q.push(v[x][i]);
                 if(v[x][i] == finish)
                    return true;
            }
        }
        q.pop();
    }
    return false;
}
int n,m,i,j,x,y,capacity;
int main()
{
    freopen( "maxflow.in", "r", stdin);
    freopen( "maxflow.out", "w", stdout);
    scanf( "%d%d" , &n , &m);
    for( i = 1; i <= m ; i++ )
    {
        scanf("%d%d%d" ,&x ,&y ,&capacity);
        v[x].push_back(y);
        v[y].push_back(x);
        c[x][y]=capacity;

    }
    int minflux,fluxmax=0;
    while(bfs(1,n))
    {
        memset( viz, false, n + 1);
        pred[1]=0;
        minflux=2356809;
        for(i = n; i != 1; i = pred[i])
        {
            if(minflux>(c[pred[i]][i] - f[pred[i]][i]))
                minflux = c[pred[i]][i] - f[pred[i]][i];
        }
        fluxmax+=minflux;
        for(i = n; i != 1; i = pred[i])
        {
            f[pred[i]][i] += minflux;
            f[i][pred[i]] -= minflux;
        }

    }
    printf("%d" , fluxmax);
    return 0;
}