Cod sursa(job #2931096)

Utilizator ArseniuVictorStefanArseniu Victor Stefan ArseniuVictorStefan Data 30 octombrie 2022 14:46:52
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.86 kb
#include <stdio.h>

#define NMAX 1000

int n, m;
int capacity[NMAX][NMAX];
short g[NMAX][NMAX];
short ptr[NMAX], level[NMAX], queue[NMAX], top;

inline const int& min(const int& x, const int& y)
{
    return (x <= y ? x : y);
}

int dfs(int u, int flow)
{
    if(u == n - 1)
        return flow;
    
    for( ; ptr[u] <= g[u][0]; ptr[u]++)
    {
        int v = g[u][ptr[u]];
        if(level[v] != level[u] + 1 || capacity[u][v] == 0)
            continue;
        
        int crt = dfs(v, min(flow, capacity[u][v]));
        if(crt == 0)
            continue;
        
        capacity[u][v] -= crt;
        capacity[v][u] += crt;
        return crt;
    }
    return 0;
}

int main()
{
    freopen("maxflow.in", "r", stdin);
    freopen("maxflow.out", "w", stdout);

    scanf("%d %d", &n, &m);
    for(int i = 0; i < m; i++)
    {
        int u, v, w;
        scanf("%d %d %d", &u, &v, &w);
        u--; v--;
        capacity[u][v] = w;
        g[u][++g[u][0]] = v;
        g[v][++g[v][0]] = u;
    }

    int maxflow = 0;
    while(true)
    {
        for(int i = 0; i < n; i++)
            level[i] = -1;
        
        level[0] = 0;
        queue[0] = 0;
        top = 1;
        for(int i = 0; i < top; i++)
        {
            int u = queue[i];
            for(int i = 1; i <= g[u][0]; i++)
            {
                int v = g[u][i];
                if(level[v] == -1 && capacity[u][v] != 0)
                {
                    level[v] = level[u] + 1;
                    queue[top++] = v;
                }
            }
        }
        
        if(level[n - 1] == -1)
            break;
        
        for(int i = 0; i < n; i++)
            ptr[i] = 1;
        
        while(int flow = dfs(0, 0x3f3f3f3f))
            maxflow += flow;
    }
    printf("%d\n", maxflow);
    return 0;
}