Cod sursa(job #1048033)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 5 decembrie 2013 10:36:42
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.33 kb
#include <fstream>
#include <vector>
#include <iostream>
//#include <bitset>
#include <queue>
#include <algorithm>
#include <utility>
#include <cstring>

using namespace std;

int cap[1005][1005];

int pasi;
int flux,n;
queue<int> coada;
//bool viz[1005];
int minim[1005];
int inapoi[1005];
vector<int> graf[1005];

//bitset<1005> viz;


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

    //vector<int>::iterator it;
    int y;
    bool stop=false;
    while(!coada.empty() && !stop)
    {
    //    cerr<<"prost!"<<endl;
        y=coada.front();
        //cout<<"se scoate "<<y<<endl;
        coada.pop();
        //for(i=1;i<=n;i++)
        //{
            //cout<<i<<' ';
          for(vector<int>::iterator it=graf[y].begin();it!=graf[y].end();it++)
          {
            //pasi++;
            if(cap[y][*it])
                if(!inapoi[*it])
                {
                    pasi++;
                    inapoi[*it]=y;
                    minim[*it]=min(cap[y][*it],minim[y]);
                    //viz[*it]=1;
                    if(*it==n)
                    {
                        stop=true;
                        break;
                    }
                    coada.push(*it);
                }
         }
        //cout<<endl;
    }

    //while(!coada.empty())
    //    coada.pop();
    //cout<<endl;
    if(!inapoi[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);
        graf[b].push_back(a);
        cap[a][b]=c;
    }

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

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