Cod sursa(job #2362322)

Utilizator CojocaruVicentiuCojocaru Vicentiu CojocaruVicentiu Data 3 martie 2019 10:14:50
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.85 kb
#include <fstream>
#include <cstring>
#include <vector>
#include <queue>
#define maxN 1010
using namespace std;
ifstream fin ("maxflow.in");
ofstream fout ("maxflow.out");
vector <int> g[maxN];
int flux, S, D, m, n, x, y, i, c[maxN][maxN], f[maxN][maxN], T[maxN];

int bfs()
{
    int ok=0;
    queue <int> q;
    T[S]=-1;
    q.push(S);
    while( !q.empty() )
    {
        int nod = q.front();
        for(auto it : g[nod])
            if(T[it] == 0 && c[nod][it] > f[nod][it])
            {
                if(it != D)
                {
                    T[it] = nod;
                    q.push(it);
                }
                else ok = 1;
            }
        q.pop();
    }
    return ok;
}

void dinitz()
{
    int drum = bfs();
    int nod, minn, i;
    while( drum )
    {
        for(auto it : g[D])
        {
            if( T[it]!=0 && c[it][D] > f[it][D])
            {
                minn = 999999999;
                T[D] = it;
                for(nod=D; nod!=S; nod=T[nod])
                        if( minn > c[T[nod]][nod]-f[T[nod]][nod] )
                                minn = c[T[nod]][nod]-f[T[nod]][nod];
                if(minn > 0)
                {
                    flux += minn;
                    for(nod = D; nod != S; nod = T[nod])
                    {
                        f[T[nod]][nod] += minn;
                        f[nod][T[nod]] -= minn;
                    }
                }
            }
        }
        for(i=1;i<=maxN;i++)
            T[i]=0;
        drum = bfs();
     }
}
int main()
{
    fin >> n >> m ;
    for(i=1;i<=m;i++)
    {
        fin >> x >> y;
        fin >> c[x][y];
        g[x].push_back(y);
        g[y].push_back(x);
    }
    S=1; D=n;
    dinitz();
    fout<<flux<<'\n';

    fin.close();
    fout.close();
    return 0;
}