Pagini recente » exersare1 | Cod sursa (job #258156) | Cod sursa (job #2164793) | Cod sursa (job #2734336) | Cod sursa (job #400672)
Cod sursa(job #400672)
#include<stdio.h>
#include<vector>
#define Nmax 1010
#define INF 1<<30
#define Min(a,b) a<b ? a : b
using namespace std;
int C[Nmax][Nmax],F[Nmax][Nmax],T[Nmax],flux,i,n,m,r,a,b,c,Q[Nmax],viz[Nmax];
vector <int> V[Nmax];
int bfs()
{
int nod,u=1,p,i,N,fiu;
Q[1]=1;
memset(viz,0,sizeof(viz));
viz[1]=1;
for(p=1;p<=u;p++)
{
nod=Q[p];
N=V[nod].size();
for(i=0;i<N;i++)
{
fiu=V[nod][i];
if(!viz[fiu] && C[nod][fiu] != F[nod][fiu])
{
Q[++u]=fiu;
viz[fiu]=1;
T[fiu]=nod;
if(fiu==n) return 1;
}
}
}
return 0;
}
int main()
{
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].push_back(b);
V[b].push_back(a);
C[a][b]=c;
}
for(flux=0; bfs(); flux+=r)
{
r=INF;
for(i=n; i!=1; i=T[i])
r=Min(r, C[T[i]][i]-F[T[i]][i]);
for(i=n; i!=1; i=T[i])
{
F[T[i]][i]+=r;
F[i][T[i]]-=r;
}
}
printf("%d",flux);
return 0;
}