Cod sursa(job #2663370)

Utilizator BogauuuBogdan Ivancu Bogauuu Data 26 octombrie 2020 11:01:56
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <fstream>
#include <vector>

using namespace std;

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

vector <int>l[1005];

bool ok,v[1005];
int n,m,t[1005],cp[1005][1005],f[1005][1005],c[1005];

void bfs()
{
    for (int i=0;i<=1005;i++) v[i]=0;
    v[1]=1;
    c[1]=1;
    int dr=1;
    int st=1;
    while (st<=dr)
    {
        int x=c[st];
        for (int j=0;j<l[x].size();j++)
        {
            int vec=l[x][j];
            if(v[vec]==0 && f[x][vec]<cp[x][vec])
            {
                v[vec]=1;
                dr++;
                c[dr]=vec;
                t[vec]=x;
                if (vec==n)
                {
                    ok=1;
                    return ;
                }
            }
        }
        st++;
    }
}

int i,j,x,y,cap,ad,af;

int main()
{
    fin >> n >> m;
    for (i=1;i<=m;i++)
    {
        fin >> x >> y >> cap;
        l[x].push_back(y);
        l[y].push_back(x);
        cp[x][y]=cap;
    }
    ok=1;
    while (ok==1)
    {
        ok=0;
        bfs();
        ad=cp[t[n]][n]-f[t[n]][n];
        x=n;
        while (t[x]!=0)
        {
            if (cp[t[x]][x]-f[t[x]][x]<ad) ad=cp[t[x]][x]-f[t[x]][x];
            x=t[x];
        }
        af+=ad;
        x=n;
        while (t[x]!=0)
        {
            f[t[x]][x]+=ad;
            f[x][t[x]]-=ad;
            x=t[x];
        }
    }
    fout << af;

    return 0;
}