Cod sursa(job #1046593)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 3 decembrie 2013 10:17:22
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <fstream>
#include <bitset>
#include <queue>
#include <algorithm>

using namespace std;

int cap[1005][1005];

int flux,n;
queue<int> coada;
bitset<1005> viz;
int minim[1005];
int inapoi[1005];

bool bfs()
{
    //cout<<"bfs()"<<endl;
    int i;
    for(i=1;i<=n;i++)
        viz[i]=0;
    coada.push(1);
    viz[1]=1;
    minim[1]=110005;
    inapoi[1]=0;

    int y;
    while(!coada.empty())
    {
        y=coada.front();
        //cout<<"se scoate "<<y<<endl;
        coada.pop();
        for(i=1;i<=n;i++)
        {
            //cout<<i<<' ';
            if(cap[y][i])
                if(!viz[i])
                {
                    inapoi[i]=y;
                    minim[i]=min(cap[y][i],minim[y]);
                    viz[i]=1;
                    if(i==n)
                        break;
                    coada.push(i);
                }
        }
        //cout<<endl;

    }
    //cout<<endl;
    if(!viz[n])
        return 0;
    return 1;
}

int main()
{
    ifstream cin("maxflow.in");
    ofstream cout("maxflow.out");

    int m,i,a,b,c;
    cin>>n>>m;

    for(i=0;i<m;i++)
    {
        cin>>a>>b>>c;
        cap[a][b]=c;
    }

    int aux;
    while(bfs())
    {
        aux=n;
        while(inapoi[aux])
        {
            //cout<<"da"<<endl;
            cap[inapoi[aux]][aux]-=minim[n];
            cap[aux][inapoi[aux]]+=minim[n];
            aux=inapoi[aux];
        }
        flux+=minim[n];
    }
    cout<<flux<<'\n';

    cin.close();
    cout.close();
    return 0;
}