Cod sursa(job #2123662)

Utilizator AlexVulpoiuAlexandru Vulpoiu AlexVulpoiu Data 6 februarie 2018 14:47:38
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int n,m,i,j,min1,flux,t[1001],c[1001][1001],f[1001][1001];
bool v[1001];
vector <int> fr,a[1001];
vector <int>::iterator it;
int bfs()
{
    int i;
    queue <int> b;
    b.push(1);
    v[1]=1;
    for(i=2;i<=n;i++)
        v[i]=0;
    while(b.size())
    {
        i=b.front();
        for(it=a[i].begin();it!=a[i].end();it++)
            if(!v[*it] && c[i][*it]-f[i][*it]>0)
            {
                b.push(*it);
                v[*it]=1;
                t[*it]=i;
                if(*it==n)
                    return 1;
            }
        b.pop();
    }
    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;
        a[i].push_back(j);
        a[j].push_back(i);
        if(j==n)
            fr.push_back(i);
        m--;
    }
    flux=0;
    while(bfs())
        for(it=fr.begin();it!=fr.end();it++)
            if(v[*it] && c[*it][n]-f[*it][n]>0)
            {
                t[n]=*it;
                min1=110001;
                j=n;
                while(j!=1)
                {
                    min1=min(min1,c[t[j]][j]-f[t[j]][j]);
                    j=t[j];
                }
                j=n;
                while(j!=1)
                {
                    f[t[j]][j]+=min1;
                    f[j][t[j]]-=min1;
                    j=t[j];
                }
                flux+=min1;
            }
    printf("%d\n",flux);
    return 0;
}