Pagini recente » Cod sursa (job #2509806) | Cod sursa (job #1504882) | Cod sursa (job #1421894) | Cod sursa (job #2430123) | Cod sursa (job #768224)
Cod sursa(job #768224)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct list{
short node;
int capacity;
struct list *next;
};
typedef struct list list;
FILE *in, *out;
list *graph[1001];
int maxFlow, f[1001][1001], capacity[1001][1001];
short N, queue[1001], root[1001];
int BF(short source, short destination)
{
int l, r;
list *p;
memset(root, 0, sizeof(root));
queue[0] = source;
root[source] = -1;
for(l = r = 0; l <= r; ++l)
for(p = graph[queue[l]]; p; p = p->next)
if(!root[p->node] && capacity[queue[l]][p->node] > f[queue[l]][p->node])
{
queue[++r] = p->node;
root[p->node] = queue[l];
if(p->node == destination) return 1;
}
return 0;
}
int main()
{
list *p;
short a, b, m, i;
int c, min;
in = fopen("maxflow.in", "r");
out = fopen("maxflow.out", "w");
fscanf(in, "%hd %hd", &N, &m);
for(; m; --m)
{
fscanf(in, "%hd %hd %d", &a, &b, &c);
p = malloc(sizeof(list));
p->node = b;
capacity[a][b] = c;
p->next = graph[a];
graph[a] = p;
}
while(BF(1, N))
{
for(min = 1 << 20, i = N; i != -1; i = root[i])
if(min > capacity[root[i]][i] - f[root[i]][i])
min = capacity[root[i]][i] - f[root[i]][i];
for(i = N; i != -1; i = root[i])
f[root[i]][i] += min;
maxFlow += min;
}
fprintf(out, "%d\n", maxFlow);
fclose(in);
fclose(out);
return 0;
}