Cod sursa(job #1970028)

Utilizator caprariuapCaprariu Alin-Paul caprariuap Data 18 aprilie 2017 20:14:45
Problema Flux maxim Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include <fstream>
#include <cstring>
#include <vector>
#include <algorithm>
#include <stack>
#include <iomanip>
#include <queue>
using namespace std;

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

#define nmax 1010
vector <int> v[nmax];
int n,m,i,c[nmax][nmax],f[nmax][nmax],p[nmax],maxflow,S,D;
bool use[nmax];

void getAP()
{
    queue <int> q;
    q.push(S);
    use[S]=1;
    while (!q.empty())
    {
        int nod=q.front();
        q.pop();
        for (i=0; i<v[nod].size(); i++)
            if (!use[v[nod][i]]&&f[nod][v[nod][i]]<c[nod][v[nod][i]])
            {
                int vecin=v[nod][i];
                p[vecin]=nod;
                use[vecin]=1;
                q.push(vecin);
            }
    }
}

int main()
{
    fin >> n >> m;
    for (i=1; i<=m; i++)
    {
        int a,b;
        fin >> a >> b;
        fin >> c[a][b];
        v[a].push_back(b);
        v[b].push_back(a);
    }
    S=1;
    D=n;
    while (1)
    {
        for (i=1; i<=n; i++)
            p[i]=-1,use[i]=0;
        getAP();
        if (p[D]==-1)
            break;
        for (i=0; i<v[D].size(); i++)
            if (p[v[D][i]]!=-1)
            {
                int nod=v[D][i],fmin=1000000000;
                while (nod!=S)
                {
                    fmin=min(fmin,c[p[nod]][nod]-f[p[nod]][nod]);
                    nod=p[nod];
                }
                nod=v[D][i];
                while (nod!=S)
                {
                    f[p[nod]][nod]+=fmin;
                    f[nod][p[nod]]-=fmin;
                    nod=p[nod];
                }
                f[nod][D]+=fmin;
                f[D][nod]-=fmin;
                maxflow+=fmin;
            }
    }
    fout << maxflow << '\n';
}