Pagini recente » Cod sursa (job #1565377) | Cod sursa (job #2106780) | Borderou de evaluare (job #438045) | Cod sursa (job #1280253) | Cod sursa (job #1245323)
#include<cstdio>
#include<cstring>
#include<queue>
#define INF 0x3f3f3f3f
#define min(a,b) (a<b?a:b)
using namespace std;
queue<int>q;
vector<int>v[1001];
int f[1001][1001],c[1001][1001];
int tata[1001],flux,x,y,z,n,m,i;
int viz[1001];
int flmin;
void cauta()
{
int varf;
q.push(1);
memset(viz,0,sizeof(viz));
viz[1]=1;
while(!q.empty())
{
int nod=q.front();
q.pop();
if (nod==n) continue;
for (i=0;i<v[nod].size();++i)
{
varf=v[nod][i];
if(c[nod][varf]==f[nod][varf] || viz[varf]) continue;
viz[varf]=1;
q.push(varf);
tata[varf]=nod;
}
}
}
int main()
{
freopen("flowmax.in","r",stdin);
freopen("flowmax.out","w",stdout);
scanf("%d%d",&n,&m);
for (i=1;i<=m;++i)
{
scanf("%d%d%d",&x,&y,&z);
v[x].push_back(y);
v[y].push_back(x);
c[x][y]=z;
}
flux=0;
while (true) //cat timp avem retea reziduala
{
cauta();
if (viz[n]==0) break;
for (i=0;i<v[n].size();++i)
{
int nod=v[n][i];
if (f[nod][n]==c[nod][n] || !viz[nod]) continue;
//daca fluxul drumului este egal cu capacitatea
//sau drumul nu face parte din reteaua reziduala
tata[n]=nod;
flmin=INF;
//calculeaza fluxul minim din reatea
for (nod=n;nod!=1;nod=tata[nod])
flmin=min(flmin,c[tata[nod]][nod]-f[tata[nod]][nod]);
//reimprospateaza reteaua
for (nod=n;nod!=1; nod=tata[nod])
{
f[tata[nod]][nod]+=flmin;
f[nod][tata[nod]]-=flmin;
}
flux+=flmin;
}
}
printf("%d\n",flux);
return 0;
}