Cod sursa(job #2122961)

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