Cod sursa(job #3038205)

Utilizator DordeDorde Matei Dorde Data 26 martie 2023 22:32:36
Problema Flux maxim Scor 60
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.46 kb
///edmons karp
#include<stdlib.h>
#include<stddef.h>
#include<stdio.h>
#define inf 1e9
#define N 1001
#define M 20001
int n , m , a , b , c , e , i , x , l , r , sz;
char viz[N];
int q[N] , t[N] , fl[N];
int v[N] , vf[N] , nxt[N];
int f[N][N];
char bfs(){
    for(i = 1 ; i <= n ; ++ i)
        viz[i] = 0;
    l = 1 , r = 1;
    q[1] = viz[1] = 1;
    fl[n] = fl[1] = inf;
    while(l <= r){
        x = q[l++];
        for(e = v[x] ; e ; e = nxt[e]){
            i = vf[e];
            if(f[x][i] > 0 && !viz[i]){
                viz[i] = 1;
                fl[i] = (fl[x] < f[x][i] ? fl[x] : f[x][i]);
                t[i] = x;
                q[++r] = i;
                if(i == n)
                    return 1;
            }
        }
    }
    return 0;
}
int maxflow(){
    int flow = 0;
    while(bfs()){
        flow += fl[n];
        int x = n;
        while(t[x]){
            f[t[x]][x] -= fl[n];
            f[x][t[x]] += fl[n];
            x = t[x];
        }
    }
    return flow;
}
void addl(int n1 , int n2){
    vf[++sz] = n2;
    nxt[sz] = v[n1];
    v[n1] = sz;
}
int main(){
    FILE *fin = fopen("maxflow.in" , "r");
    FILE *fout = fopen("maxflow.out" , "w");
    fscanf(fin , "%d%d" , &n , &m);
    for(i = 1 ; i <= m ; ++ i){
        fscanf(fin , "%d%d%d" , &a , &b , &c);
        f[a][b] = c;
        addl(a , b);
        addl(b , a);
    }
    fprintf(fout , "%d\n" , maxflow());
    return 0;
}