Cod sursa(job #2582326)

Utilizator Mirela_MagdalenaCatrina Mirela Mirela_Magdalena Data 16 martie 2020 16:35:29
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.78 kb
#define NMAX 1005
#define oo 0x3f3f3f3f
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;

ifstream f("maxflow.in");
ofstream g("maxflow.out");

int n, m, flomax;
int viz[NMAX], t[NMAX], cap[NMAX][NMAX], flo[NMAX][NMAX];
vector<int> graph[NMAX];
queue<int> Q;

void read()
{
    int x, y, c;
    f>>n>>m;
    for(int i = 1; i <= m; ++i)
    {
        f>>x>>y>>c;
        cap[x][y] = c;

        graph[x].push_back(y);
        graph[y].push_back(x);
    }
}

void all0()
{
    while(!Q.empty())
        Q.pop();
    for(int i = 1; i <= n; ++i)
    {
        viz[i] = 0;
        t[i] = 0;
    }
}



bool bfs()
{
    memset(viz, 0, sizeof(viz));

    Q.push(1);
    while(!Q.empty())
    {
        int from = Q.front();
        Q.pop();

        for(auto &v:graph[from])
            if(viz[v] == 0 && cap[from][v] - flo[from][v] > 0)
            {
                t[v] = from;
                viz[v] = 1;
                if(v != n)
                    Q.push(v);
            }
    }
    return viz[n];
}



void edmonds_karp()
{
    while(bfs()) // inca mai am vreun mod de a ajunge la destinatie
    {
        for(auto &fin:graph[n])
        {
            int act_max_flow = oo;
            for(int v = n; v != 1; v = t[v])
                act_max_flow = min(act_max_flow, cap[t[v]][v] - flo[t[v]][v]); // care e maximul pe care il pot 'baga' pe drum ai sa nu depasesc capacitatea

            for(int v = n; v != 1; v = t[v])
            {
                flo[t[v]][v] += act_max_flow;
                flo[v][t[v]] -= act_max_flow;
            }

            flomax += act_max_flow;
        }
    }
}



int main()
{
    read();
    edmonds_karp();
    g<<flomax;
    return 0;
}