Cod sursa(job #2174842)

Utilizator caprariuapCaprariu Alin-Paul caprariuap Data 16 martie 2018 13:46:39
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include <fstream>
#include <algorithm>
#include <iomanip>
#include <vector>
#include <stack>
#include <queue>
#define nmax 1010

using namespace std;

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

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

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

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;
        getPaths();
        if (p[D]==-1)
            break;
        for (i=0; i<v[D].size(); i++)
            if (p[v[D][i]]!=-1)
            {
                int nod,fmin;
                nod=v[D][i];
                fmin=c[v[D][i]][D]-f[v[D][i]][D];
                while (nod!=S)
                {
                    fmin=min(fmin,c[p[nod]][nod]-f[p[nod]][nod]);
                    nod=p[nod];
                }
                nod=v[D][i];
                f[v[D][i]][D]+=fmin;
                f[D][v[D][i]]-=fmin;
                while (nod!=S)
                {
                    f[p[nod]][nod]+=fmin;
                    f[nod][p[nod]]-=fmin;
                    nod=p[nod];
                }
                maxflow+=fmin;
            }
    }
    fout << maxflow << '\n';
}