Cod sursa(job #1117768)

Utilizator tudgal1001Profir Tudor tudgal1001 Data 23 februarie 2014 20:01:23
Problema Flux maxim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <cstdio>
#include <vector>
#define inf 3333333
#define NMax 1005
using namespace std;

int viz[NMax],tata[NMax],que[NMax],N;
int cap[NMax][NMax],fl[NMax][NMax];
vector<int> vc[NMax];

int bf ()
{
    int i,st=1,dr=1,crt;
    viz[1]=1;
    for (i=2; i<=N; i++)
        viz[i]=0;
    que[st]=1;
    while (st<=dr)
    {
        crt=que[st];
        if (crt!=N)
        {
            for (i=0; i<vc[crt].size(); i++)
                if (!viz[vc[crt][i]] && cap[crt][vc[crt][i]]>fl[crt][vc[crt][i]])
                {
                    que[++dr]=vc[crt][i];
                    viz[vc[crt][i]]=1;
                    tata[vc[crt][i]]=crt;
                }
        }
        st++;
    }
    return viz[N];
}

int main()
{
    int i,crt,min_flux,flux=0,x,y,c,M,nod;
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    scanf("%d%d",&N,&M);
    for (i=1; i<=M; i++)
    {
        scanf("%d%d%d",&x,&y,&c);
        cap[x][y]=c;
        vc[x].push_back(y);
        vc[y].push_back(x);
    }
    while (bf())
    {
        for (i=0; i<vc[N].size(); i++)
        {
            crt=vc[N][i];
            if (viz[crt])
            {
                min_flux=inf;
                for (nod=N; nod!=1; nod=tata[nod])
                    if (cap[tata[nod]][nod]-fl[tata[nod]][nod]<min_flux)
                        min_flux=cap[tata[nod]][nod]-fl[tata[nod]][nod];
                for (nod=N; nod!=1; nod=tata[nod])
                {
                    fl[tata[nod]][nod]+=min_flux;
                    fl[nod][tata[nod]]-=min_flux;
                }
            }
            flux+=min_flux;
        }
    }
    printf("%d\n",flux);
    return 0;
}