Pagini recente » Cod sursa (job #1872702) | Cod sursa (job #2514778) | Cod sursa (job #1070175) | Cod sursa (job #520704) | Cod sursa (job #2970332)
#include <iostream>
#include <vector>
#include <queue>
#include <fstream>
#include <cmath>
#include <climits>
using namespace std;
int n,m;
int tata[1001], viz[1001];
int capacitate [1001][1001];
int flux[1001][1001];
int construire_lant()
{
int i,j,u,v,w,flx;
for(i=1; i<=n; i++)
{
tata[i]=0;
viz[i]=0;
}
queue<int> q;
q.push(1);
viz[1]=1;
while(!q.empty())
{
u=q.front();
q.pop();
for(i=1;i<=n;i++) //arcele directe
{
v=i;
w=capacitate[u][v]; //capacitatea
flx=flux[u][v]; //fluxul trimis
if(viz[v]==0 && w-flx>0)
{
q.push(v);
viz[v]=1;
tata[v]=u;
if(v==n)
return 1;
}
}
for(i=1;i<=n;i++)
{
v=i;
flx=flux[v][u];
if(viz[v]==0 && flx>0)
{
q.push(v);
viz[v]=1;
tata[v]=-u;
if(v==n)
return 1;
}
}
}
return 0;
}
void revizuieste_lant()
{
int i,x,t,w,min_f=INT_MAX;
x=n;
while(x!=1)
{
t=tata[x];
if(t>0)
{
w=capacitate[t][x] - flux[t][x];
}
else
{
t=abs(t);
w=flux[x][t];
}
min_f=min(min_f,w);
x=t;
}
x=n;
while(x!=1)
{
t=tata[x];
if(t>0)
flux[t][x]+=min_f;
else
{
t=abs(t);
flux[x][t]-=min_f;
}
x=t;
}
}
int main()
{
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int x, y, c, i, j;
f >> n >> m;
for (i = 1; i <= m; i++)
{
f >> x >> y >> c;
capacitate[x][y]=c;
}
while(construire_lant()==1)
revizuieste_lant();
int s=0;
for(i=2;i<=n;i++)
s+=flux[1][i];
g<<s<<endl;
return 0;
}