Cod sursa(job #1284094)

Utilizator VictoriaNevTascau Victoria VictoriaNev Data 6 decembrie 2014 11:01:03
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#include <cstring>
#define NMAX 1005
#define INF (1LL<<31)-1;
using namespace std;
int n, m, pred[NMAX], c[NMAX][NMAX], f[NMAX][NMAX], i, u, v, cap;
bool viz[NMAX];
vector<int> g[NMAX];
int BFS()
{
    int p;
    queue<int> q;
    memset(viz,0,sizeof(viz));
    q.push(1);
    viz[1]=1;
    while(!q.empty())
    {
        p=q.front();
        if(p==n)
            return 1;
        for(vector <int>::iterator it=g[p].begin(); it!=g[p].end(); ++it)
            if(!viz[*it]&&c[p][*it]>f[p][*it])
            {
                viz[*it]=1;
                pred[*it]=p;
                q.push(*it);
            }
        q.pop();
    }
    return 0;
}

int main()
{
    ifstream cin("maxflow.in");
    ofstream cout("maxflow.out");
    cin>>n>>m;
    for(i=1; i<=m; i++)
    {
        cin>>u>>v>>cap;
        c[u][v]+=cap;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    int fx=0, minim;
    while(BFS())
    {
        for(vector<int>::iterator it=g[n].begin(); it!=g[n].end(); ++it)
            if(f[*it][n]<c[*it][n]&&viz[*it])
            {
                pred[n]=*it;
                int minim=INF;

                for(i=n; i!=1; i=pred[i])
                if(minim>c[pred[i]][i]-f[pred[i]][i])
                    minim=c[pred[i]][i]-f[pred[i]][i];

                for(i=n; i!=1; i=pred[i])
                {
                    f[pred[i]][i]+=minim;
                    f[i][pred[i]]-=minim;
                }
                fx+=minim;
            }
    }
    cout<<fx<<'\n';
    return 0;
}