Cod sursa(job #1389612)

Utilizator mateidanutDanut Gabriel Matei mateidanut Data 16 martie 2015 14:22:05
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>
//#include<iostream>
#include <queue>
#define NMAX 1001
using namespace std;

ifstream f("flux.in");
ofstream g("flux.out");

const int inf=2000000;
int n, m, i, j, k, T[NMAX], C[NMAX][NMAX], F[NMAX][NMAX], s, d, flux;


int BF(int s, int d)
{   int i, nod;
    queue<int> Q;
    for (i=1; i<=n; ++i)
        T[i]=0;
    Q.push(s);
    T[s]=-1;
    while (!Q.empty())
    {   nod=Q.front();
        Q.pop();
        for (i=2; i<=n; ++i)
            if (!T[i] && C[nod][i]>F[nod][i])
            {   Q.push(i);
                T[i]=nod;
               // cout<<i<<" ";
                if (i==d)return 1;
            }
    }
    return 0;
}

void Flux_max()
{   int i, r;
    for (flux=0; BF(1, n); flux+=r)
    {   r=inf;
        i=d;
       // cout<<"**   ";
       // cout<<i<<"   %%%";
        while (i!=s)
        {   r=min(r, C[T[i]][i]-F[T[i]][i]);
          //  cout<<i<<" ";
            i=T[i];
        }
      //  cout<<"##\n";
        i=d;
       // cout<<r<<"\n";
        while (i!=s)
        {   F[T[i]][i]+=r;
            F[i][T[i]]-=r;
            i=T[i];
        }
      // cout<<r<<"\n";
    }
}

int main()
{   f>>n>>m;
    s=1;
    d=n;
    for (; m; --m)
    {   f>>i>>j>>k;
        C[i][j]=k;
    }
    Flux_max();
    g<<flux<<'\n';
    return 0;
}