Pagini recente » Cod sursa (job #150028) | Cod sursa (job #2757633) | Cod sursa (job #1045293) | Cod sursa (job #1414668) | Cod sursa (job #578784)
Cod sursa(job #578784)
#include <stdio.h>
#include <queue>
#include <string.h>
#include <stdlib.h>
#define LIMIT 100
#define DEBUG 0
using namespace std;
int Cap[LIMIT][LIMIT];
int Flux[LIMIT][LIMIT];
int Vizited[LIMIT];
int NrVf;
int Enter, Exit;
int BFS()
{
queue<int> Q;
Q.push(Enter);
Vizited[Enter] = 1;
while (!Q.empty())
{
int x = Q.front(); Q.pop();
for (int i=1; i<=NrVf; i++)
if (!Vizited[i]){
if (Flux[x][i] < Cap[x][i]) { Vizited[i] = x; Q.push(i); }
else if (Flux[i][x]) { Vizited[i] = -x; Q.push(i); }
}
}
return (!Vizited[Exit]);
}
void edm_karp()
{
int Lant[LIMIT];
int a,b,lg,v;
do {
memset(Vizited, 0, sizeof(int) * (NrVf+2));
if (BFS()) return;
Lant[0] = Exit; lg = 0; a = b = 0x7fffffff;
while (Lant[lg] != Enter)
{
++lg;
Lant[lg] = abs(Vizited[Lant[lg-1]]);
if (Vizited[Lant[lg-1]] > 0)
a = min(a, Cap[Lant[lg]][Lant[lg-1]] - Flux[Lant[lg]][Lant[lg-1]]);
else if (Vizited[Lant[lg-1]] < 0)
b = min(b, Flux[Lant[lg-1]][Lant[lg]]);
}
v = min (a,b);
for (int i=lg; i > 0; i--)
if (Vizited[Lant[i-1]] > 0) Flux[Lant[i]][Lant[i-1]] += v;
else Flux[Lant[i-1]][Lant[i]] -= v;
} while (1);
}
int main()
{
freopen("maxflow.in", "r", stdin);
#if DEBUG == 0
freopen("maxflow.out", "w", stdout);
#endif
int M;
scanf("%d %d\n", &NrVf, &M);
for (int x,y,c; M > 0; M--)
{
scanf ("%d %d %d\n", &x, &y, &c);
Cap[x][y] = c;
}
Enter = 1; Exit = NrVf;
edm_karp();
int vf = 0;
for (int i=1; i<=NrVf; i++, vf+=Flux[i][Exit])
#if DEBUG == 1
for (int j=1; j<=NrVf; j++)
if (Flux[i][j]) printf("Fluxul arcului (%d,%d) = %d\n", i, j, Flux[i][j]);
#else
;
#endif
printf ("%d\n", vf);
return 0;
}