Cod sursa(job #2122803)

Utilizator AlexVulpoiuAlexandru Vulpoiu AlexVulpoiu Data 5 februarie 2018 15:14:32
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.84 kb
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int n,m,i,j,fmin,flux,b[1001],t[1001],f[1001][1001];
vector <int> w,a[1001];
vector <int>::iterator it;
int bfs()
{
    int p,u,uu;
    vector <bool> v(1001,0);
    p=u=uu=1;
    b[1]=1;
    w.clear();
    for(p=1;p<=u;p++)
    {
        uu=u;
        for(it=a[b[p]].begin();it!=a[b[p]].end();it++)
            if(f[b[p]][*it]+f[*it][b[p]]>0 && !v[*it])
            {
                v[*it]=1;
                t[*it]=b[p];
                b[++u]=*it;
            }
        if(uu==u && f[b[p]][n]-f[n][b[p]]>0 && b[p]!=1)
            w.push_back(b[p]);
    }
    if(w.size())
        return 1;
    else
        return 0;
}
int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    scanf("%d %d\n",&n,&m);
    while(m)
    {
        scanf("%d %d %d\n",&i,&j,&flux);
        f[i][j]=flux;
        if(j!=n)
            a[i].push_back(j);
        else
            a[j].push_back(i);
        m--;
    }
    flux=0;
    while(bfs())
        for(it=w.begin();it!=w.end();it++)
        {
            j=n;
            t[n]=*it;
            fmin=110001;
            while(j!=1)
            {
                if(f[t[j]][j]+f[j][t[j]]>0)
                    fmin=min(fmin,f[t[j]][j]+f[j][t[j]]);
                else
                {
                    fmin=110001;
                    break;
                }
                j=t[j];
            }
            if(fmin<110001)
            {
                flux+=fmin;
                j=n;
                while(j!=1)
                {
                    f[j][t[j]]-=fmin;
                    j=t[j];
                }
            }
            else
                if(j==n)
                    break;
        }
    printf("%d\n",flux);
    return 0;
}