Pagini recente » Cod sursa (job #1586172) | Cod sursa (job #632591) | Cod sursa (job #970220) | Cod sursa (job #3138677) | Cod sursa (job #768246)
Cod sursa(job #768246)
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
struct list{
int v;
struct list *next;
} *G[1001];
int N, root[1001], cap[1001][1001], maxFlow;
int BF()
{
int l, r, queue[1001];
struct list *p;
memset(root, 0, sizeof(root));
queue[0] = 1;
root[1] = -1;
for(l = r = 0; l <= r; ++l)
for(p = G[ queue[l] ]; p; p = p->next)
if(!root[p->v] && cap[ queue[l] ][p->v])
{
queue[++r] = p->v;
root[p->v] = queue[l];
if(p->v == N) return 1;
}
return 0;
}
int main()
{
struct list *p;
FILE *in, *out;
int a, b, c, min, m, i;
in = fopen("maxflow.in", "r");
fscanf(in, "%d %d", &N, &m);
for(; m; --m)
{
fscanf(in, "%d %d %d", &a, &b, &c);
cap[a][b] = c;
p = malloc(sizeof(struct list));
p->v = b;
p->next = G[a];
G[a] = p;
}
fclose(in);
while(BF())
{
for(min = 1<<20, i = N; root[i] != -1; i = root[i])
if(min > cap[ root[i] ][i])
min = cap[ root[i] ][i];
for(i = N; root[i] != -1; i = root[i])
cap[ root[i] ][i] -= min;
maxFlow += min;
}
out = fopen("maxflow.out", "w");
fprintf(out, "%d\n", maxFlow);
fclose(out);
return 0;
}