Pagini recente » Cod sursa (job #1544396) | Cod sursa (job #1079825) | Cod sursa (job #1745540) | Cod sursa (job #1359086) | Cod sursa (job #1376945)
#include <fstream>
#include <queue>
#define NMAX 1003
#define INF 0x3f3f3f3f
#define MMAX 5003
using namespace std;
queue <int> q ;
int c[NMAX][NMAX],flow[NMAX][NMAX] ;
int flux=0 ;
int lst[NMAX],t[NMAX],nrvf=0 ;
int vf[2*MMAX] ;
int urm[2*MMAX] ;
int n,m ;
ifstream f("maxflow.in") ;
ofstream g("maxflow.out") ;
inline bool bf()
{
bool ok=0 ;
for(int i=1;i<=n;i++)
t[i]=0 ;
t[1]=-1 ;
q.push(1) ;
while(!q.empty())
{
int x=q.front() ;
for(int i= lst[x];i!=0;i=urm[i])
{
int y=vf[i] ;
if(t[y]==0&&c[x][y]>flow[x][y])
if(y!=n)
{
t[y]=x ;
q.push(y) ;
}
else
ok=1 ;
}
q.pop() ;
}
return ok ;
}
void Solve()
{
bool drum=1 ;
while(drum)
{
drum=bf() ;
for(int i=lst[n];i!=0;i=urm[i])
{
int y=vf[i] ;
if(t[y]&&c[y][n]>flow[y][n])
{
t[n]=y ;
int minim = INF ;
for(int x=n ;x!=1;x=t[x])
if(minim>c[t[x]][x]-flow[t[x]][x])
minim= c[t[x]][x]-flow[t[x]][x] ;
if(minim<=0)
continue ;
flux +=minim ;
for(int x=n;x!=1;x=t[x])
{
flow[t[x]][x]+=minim ;
flow[x][t[x]]-=minim ;
}
}
}
}
}
int main()
{
int x,y ;
f>>n>>m ;
for(int i=1;i<=m;i++)
{
f>>x>>y ;
f>>c[x][y] ;
vf[++nrvf]=y ;
urm[nrvf]=lst[x] ;
lst[x]=nrvf ;
vf[++nrvf]=x ;
urm[nrvf]=lst[y] ;
lst[y]=nrvf ;
}
Solve() ;
g<<flux<<'\n' ;
return 0;
}