Cod sursa(job #1069917)

Utilizator Dddarius95Darius-Florentin Neatu Dddarius95 Data 30 decembrie 2013 17:50:00
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <fstream>
#include <vector>
#include <queue>
#define Nmax 1009
#define Inf (1<<30)
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");

int N,M,Capacity[Nmax][Nmax],Flow[Nmax][Nmax],T[Nmax],MaxFlow;
vector < int >  Graph[Nmax];
queue < int > Q;

void Read()
{
    f>>N>>M;
    for(int i=1;i<=M;++i)
    {
        int x,y,c;
        f>>x>>y>>c;
        Graph[x].push_back(y);
        Graph[y].push_back(x);
        Capacity[x][y]=c;
    }
}

int BFS()
{
    for(int i=1;i<=N;++i)T[i]=0;
    T[1]=1; Q.push(1);
    for( ; !Q.empty() ; )
    {
        int nod=Q.front();
        Q.pop();
        if(nod==N) continue;
        for(vector<int>::iterator it=Graph[nod].begin(); it!=Graph[nod].end(); ++it)
            if(!T[*it] && Flow[nod][*it]<Capacity[nod][*it])
            {
                T[*it]=nod;
                Q.push(*it);
            }
    }
    return T[N];
}
void FindFlow()
{
    for( ; BFS() ; )
        for(vector<int>::iterator it=Graph[N].begin() ; it!=Graph[N].end() ; ++it)
        {
            if(!T[*it] || Flow[*it][N]==Capacity[*it][N]) continue;
            T[N]=*it;
            int MinFlow=Inf;
            for(int i=N;i!=T[i];i=T[i])
                MinFlow=min(MinFlow,Capacity[T[i]][i]-Flow[T[i]][i]);
            if(!MinFlow) continue;
            for(int i=N;i!=T[i];i=T[i])
            {
                Flow[T[i]][i]+=MinFlow;
                Flow[i][T[i]]-=MinFlow;
            }
            MaxFlow+=MinFlow;
        }
    g<<MaxFlow<<'\n';
}
int main()
{
    Read();
    FindFlow();
    f.close();g.close();
    return 0;
}