Cod sursa(job #755757)
#include <fstream>
#include <vector>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
using namespace std;
long minint(long a,long b)
{
if (a > b)
{
return b;
}
return a;
}
long N,M;
long Flux;
long finish;
vector<pair<int,int> *> *Muchii;
long Parinti[1005];
long Parinti2[1005];
long Viz[1005];
long QIn,QOut;
long Coada[1005];
void Push(long a)
{
Coada[QIn] = a;
QIn += 1;
}
long Pop(void)
{
long res = Coada[QOut];
QOut += 1;
return res;
}
void BFS(void)
{
finish = 1;
memset(Viz,0,1005 * sizeof(long));
QIn = 0;
QOut = 0;
Push(1);
Parinti[1] = 1;
while ((QIn - QOut) > 0)
{
long x = Pop();
for (long l = 0;l < Muchii[x].size();l += 1)
{
if (Viz[Muchii[x][l]->first] == 1)
{
continue;
}
if (Muchii[x][l]->second > 0)
{
if (Muchii[x][l]->first == N)
{
finish = 0;
long t = x;
long newflow = Muchii[x][l]->second;
while (Parinti[x] != x)
{
newflow = minint(Muchii[Parinti[x]][Parinti2[x]]->second,newflow);
x = Parinti[x];
}
Flux += newflow;
x = t;
Muchii[x][l]->second -= newflow;
while (Parinti[x] != x)
{
Muchii[Parinti[x]][Parinti2[x]]->second -= newflow;
x = Parinti[x];
}
continue;
}
Parinti[Muchii[x][l]->first] = x;
Parinti2[Muchii[x][l]->first] = l;
Push(Muchii[x][l]->first);
}
}
}
}
int main(void)
{
long i,a,b,d;
fstream fin("maxflow.in",ios::in);
fstream fout("maxflow.out",ios::out);
Muchii = new vector<pair<int,int> *>[1005];
fin >> N >> M;
for (i = 0;i < M;i += 1)
{
fin >> a >> b >> d;
Muchii[a].push_back(new pair<int,int>(b,d));
}
while (finish == 0)
{
BFS();
}
fout << Flux;
fin.close();
fout.close();
return 0;
}