Cod sursa(job #1418475)

Utilizator ArchazeyBaltatu Andrei-Mircea Archazey Data 13 aprilie 2015 11:18:56
Problema Flux maxim Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include<bits/stdc++.h>
using namespace std;

struct cell
{
    int nod,flow,ind;
};

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

const int NMAX=1005;

int n,m,sol,ad[NMAX],fl[NMAX];
int nxtf[NMAX],nxtn[NMAX];
vector<cell>v[NMAX];
bitset<NMAX>viz;

void DFS(int x)
{
    viz[x]=1;
    for (vector<cell>::iterator it=v[x].begin();it!=v[x].end();it++)
        if (!viz[(*it).nod] && ad[(*it).ind]<fl[(*it).ind])
            {
                nxtf[(*it).nod]=(*it).ind;
                nxtn[(*it).nod]=x;
                DFS((*it).nod);
            }
}

int main()
{
    int i,x,kkt,mn;
    bool ok;
    cell k;
    fin>>n>>m;
    for (i=1;i<=m;i++)
        {
            k.ind=i;
            fin>>x>>k.nod>>k.flow;
            fl[i]=k.flow;
            v[x].push_back(k);
        }
    ok=1;
    while (ok==1)
        {
            ok=0;
            for (i=1;i<=n;i++) {viz[i]=0;nxtf[i]=nxtn[i]=0;}
            DFS(1);
            if (nxtf[n]!=0)//avem drum
                {
                    ok=1;
                    kkt=n;mn=1<<30;
                    while (kkt>1)
                        {
                            mn=min(mn,fl[nxtf[kkt]]-ad[nxtf[kkt]]);
                            kkt=nxtn[kkt];
                        }
                    kkt=n;
                    while (kkt>1)
                        {
                            ad[nxtf[kkt]]+=mn;
                            kkt=nxtn[kkt];
                        }
                }
        }
    for (i=0;i<v[1].size();i++) sol+=ad[v[1][i].ind];
    fout<<sol<<"\n";
    return 0;
}