Pagini recente » Cod sursa (job #915969) | Cod sursa (job #3251892) | Cod sursa (job #2775374) | Cod sursa (job #2864721) | Cod sursa (job #1539618)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NMAX 1005
#define INF 1000000000
#define min(a,b) ((a)<(b)?(a):(b))
typedef struct node{
int x;
struct node* next;
} NOD;
NOD* g[NMAX];
int viz[NMAX], C[NMAX][NMAX], F[NMAX][NMAX], P[NMAX], N, M, cd[NMAX];
void add_node(NOD **a, int val){
NOD* w = (NOD*)malloc(sizeof(NOD));
w->x = val;
w->next = *a;
*a = w;
}
int BFS(){
int i, j, nod, V;
NOD *w = (NOD*)malloc(sizeof(NOD));
memset(viz, 0, sizeof(viz));
cd[0] = 1;
cd[1] = 1;
viz[1] = 1;
for(i = 1; i <= cd[0]; ++i){
nod = cd[i];
if(nod == N) continue;
w = g[nod];
while(w != NULL){
V = w->x;
w = w->next;
if(C[nod][V] == F[nod][V] || viz[V]) continue;
viz[V] = 1;
cd[++cd[0]] = V;
P[V] = nod;
}
}
return viz[N];
}
int main(){
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
scanf("%d %d", &N, &M);
int i, x, y, z, flow, fmin, nod;
for(i = 0; i < M; ++i){
scanf("%d %d %d", &x, &y, &z);
C[x][y] += z;
add_node(&g[x], y);
add_node(&g[y], x);
}
NOD *w;
for(flow = 0; BFS();){
w = g[N];
while(w != NULL){
nod = w->x;
w = w->next;
if(F[nod][N] == C[nod][N] || !viz[nod]) continue;
P[N] = nod;
fmin = INF;
for(nod = N; nod != 1; nod = P[nod]){
fmin = min(fmin, C[P[nod]][nod] - F[P[nod]][nod]);
}
//if(fmin == 0) continue;
for(nod = N; nod != 1; nod = P[nod]){
F[P[nod]][nod] += fmin;
F[nod][P[nod]] -= fmin;
}
flow += fmin;
}
}
printf("%d", flow);
return 0;
}