Pagini recente » Cod sursa (job #1110933) | Cod sursa (job #164572) | Cod sursa (job #2394366) | Cod sursa (job #1175293) | Cod sursa (job #2497263)
#include<cstdio>
#include<cstring>
#include<queue>
const int NMAX = 1000;
int ad[NMAX + 1][NMAX + 1];
int flow[NMAX + 1][NMAX + 1];
int c[NMAX + 1][NMAX + 1];
int parent[NMAX + 1];
std :: queue<int>q;
int n , m ;
bool bfs()
{
q.push(1);
int ok = 0;
memset(parent,0,(n+1)*sizeof(int));
parent[1] = 1;
while(q.empty() == false)
{
int nod = q.front();
if(nod == n){
ok = 1;
break;
}
q.pop();
for(int i = 1 ; i <= n ; i ++)
{
if(c[nod][i] - flow[nod][i] > 0)
{
if(parent[i] == 0){
parent[i] = nod;
q.push(i);
}
}
}
}
while(q.empty() == false)
q.pop();
return ok;
}
int drum()
{
int tata = parent[n] , nod = n, minim = 1 << 30;
while(nod != 1)
{
minim = std :: min(minim , c[tata][nod] - flow[tata][nod]);
nod = tata;
tata = parent[nod];
}
return minim;
}
void actualizeaza(int n , int flux)
{
int tata = parent[n] , nod = n;
while(nod != 1)
{
flow[tata][nod] += flux;
flow[nod][tata] -= flux;
nod = tata;
tata = parent[tata];
}
}
int main()
{
int x , y;
freopen("maxflow.in" , "r" , stdin);
freopen("maxflow.out" ,"w" , stdout);
scanf("%d%d" , &n , &m);
for(int i = 1; i <= m ; i ++)
{
scanf("%d%d" , &x , &y);
scanf("%d", &c[x][y]);
ad[x][y] = 1;
}
int rez = 0;
while(bfs())
{
int f = drum();
actualizeaza(n , f);
rez += f;
}
printf("%d" , rez);
}