Pagini recente » Cod sursa (job #1890203) | Cod sursa (job #1379125) | Cod sursa (job #259460) | Cod sursa (job #127452) | Cod sursa (job #563494)
Cod sursa(job #563494)
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
#define NMAX 1005
#define minim(a,b) (a<b ? a : b)
#define INF 1000000000
#define pb push_back
int n,m,sol;
int q[NMAX],pred[NMAX];
vector<int> v[NMAX];
int f[NMAX][NMAX];
int cap[NMAX][NMAX];
char viz[NMAX];
int bfs(int start)
{
int i,inc,sf,nod,lim,x;
memset(viz,0,sizeof(viz));
q[1]=start;
inc=1;sf=1;
while(inc<=sf)
{
nod=q[inc];
lim=v[nod].size();
for(i=0;i<lim;i++)
if(!viz[x=v[nod][i]] && f[nod][x]<cap[nod][x])
{
q[++sf]=x;
viz[x]=1;
pred[x]=nod;
}
inc++;
}
return viz[n];
}
int main ()
{
int i,a,b,c,val;
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
v[a].pb(b);
cap[a][b]=c;
v[b].pb(a);
cap[b][a]=0;
}
while(bfs(1))
{
val=INF;
for(i=n;i!=1;i=pred[i])
val=minim(val,cap[pred[i]][i]-f[pred[i]][i]);
sol+=val;
for(i=n;i!=1;i=pred[i])
{
f[pred[i]][i]+=val;
f[i][pred[i]]-=val;
}
}
printf("%d\n", sol);
return 0;
}