Pagini recente » Cod sursa (job #2840379) | Cod sursa (job #2186787) | Monitorul de evaluare | Cod sursa (job #1354465) | Cod sursa (job #1661329)
#include <bits/stdc++.h>
using namespace std;
struct nod{
int y,next;
};
#define sN (sizeof(int)*(N))
#define sM (sizeof(int)*(M))
#define N (n+2)
#define M (m+2)
#define Nmax 1005
#define Mmax 10005
int n,m ,x,y,z,pos , sq,eq , _min,tmp;
int cap[Nmax][Nmax],flux[Nmax][Nmax];
int lst[Nmax],q[Nmax],p[Nmax];
bool use[Nmax];
nod ct[Mmax];
int flow,new_flow;
int main(void)
{
//freopen("critice.in" , "r" , stdin);
freopen("maxflow.in" , "r" , stdin);
scanf("%d %d",&n,&m);
pos=1;
for(int i=1;i<=m;++i){
scanf("%d %d %d", &x ,&y ,&z );
++pos;
ct[pos] = { y , lst[x] };
lst[x] = pos;
++pos;
ct[pos] = { x , lst[y] };
lst[y] = pos;
//cap[x][y] = cap[y][x] = z;
cap[x][y] = z;
}
do{
new_flow = 0;
sq = 1,eq=1;
q[1] = 1;
memset(use,0,sizeof(use));
memset(p,0,sizeof(p));
use[1]=1;
while( sq <= eq ){
x = q[sq]; ++sq;
if(x==n) continue;
for( z = lst[x] ; z ; z = ct[z].next ){
y = ct[z].y;
if( use[y] || cap[x][y] == flux[x][y] ) continue;
use[y] = 1;
p[y] = x;
q[++eq] = y;
}
}
if( !use[n] ) continue;
for(z =lst[n]; z ; z = ct[z].next){
y =ct[z].y;
p[n] = y;
_min = cap[y][n] - flux[y][n];
if( !use[y] || _min ==0 ) continue;
while( p[y] ){
tmp = cap[p[y]][y] - flux[p[y]][y];
if( tmp < _min ) _min = tmp;
y = p[y];
}
if( _min <= 0 ) continue; /* !!!!!!!!!!! */
y =n;
while( p[y] ){
flux[p[y]][y] += _min;
flux[y][p[y]] -= _min;
y = p[y];
}
new_flow += _min;
}
flow += new_flow;
}while( new_flow );
//printf("%d",flow);
//freopen("critice.out", "w" , stdout);
freopen("maxflow.out", "w" , stdout);
printf("%d",flow);
return 0;
}