Cod sursa(job #1046595)

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

using namespace std;

int cap[1005][1005];

int flux,n;
queue<int> coada;
bitset<1005> viz;
int minim[1005];
int inapoi[1005];
vector<int> graf[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;

    vector<int>::iterator it;
    int y;
    while(!coada.empty())
    {
        y=coada.front();
        //cout<<"se scoate "<<y<<endl;
        coada.pop();
        //for(i=1;i<=n;i++)
        //{
            //cout<<i<<' ';
          for(it=graf[y].begin();it!=graf[y].end();it++)
            if(cap[y][*it])
                if(!viz[*it])
                {
                    inapoi[*it]=y;
                    minim[*it]=min(cap[y][*it],minim[y]);
                    viz[*it]=1;
                    if(i==n)
                        break;
                    coada.push(*it);
                }
        //}
        //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;
        graf[a].push_back(b);
        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;
}