Pagini recente » Cod sursa (job #1907134) | Cod sursa (job #1553337) | Cod sursa (job #193877) | Cod sursa (job #1433056) | Cod sursa (job #2840384)
#include <iostream>
#include <fstream>
#include <vector>
#include <deque>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
const int MAX=1005;
const int INF=1e9;
int n,m,a,b,c,t[MAX],viz[MAX],flux,fmax,cap[MAX][MAX];
bool ok;
vector < int > v[MAX];
deque < int > q;
void backtrack(int x,int &flux)
{
flux=INF;
int xcp=x;
while(t[xcp])
{
if(cap[t[xcp]][xcp]<flux)
flux=cap[t[xcp]][xcp];
xcp=t[xcp];
}
fmax+=flux;
while(t[x])
{
cap[x][t[x]]+=flux;
cap[t[x]][x]-=flux;
x=t[x];
}
}
void BFS(int src, int dest)
{
for(int i=1;i<=n;i++)
viz[i]=0;
q.push_back(src);
viz[src]=1;
ok=0;
while(!q.empty() && !ok)
{
int nod=q.front();
q.pop_front();
for(auto vec : v[nod])
if(!viz[vec] && cap[nod][vec]>0)
{
viz[vec]=1;
q.push_back(vec);
t[vec]=nod;
if(vec==dest)
{
ok=1;
backtrack(dest,flux);
}
}
}
if(ok)
{
q.clear();
BFS(src,dest);
}
}
int main()
{
fin >> n >> m;
while(m--)
{
fin >> a >> b >> c;
v[a].push_back(b);
cap[a][b]=c;
}
BFS(1,n);
fout << fmax;
return 0;
}