Cod sursa(job #2701318)

Utilizator Marius7122FMI Ciltea Marian Marius7122 Data 30 ianuarie 2021 14:02:47
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

const int N = 1005;

int n, m;
int cap[N][N], flow[N][N], t[N];
vector<bool> vis;

void bfs(int startNode)
{
    vis.assign(n + 1, false);
    queue<int> q;

    q.push(startNode);
    vis[startNode] = true;
    t[startNode] = 0;
    while(!q.empty())
    {
        int node = q.front();
        q.pop();

        for(int y = 1; y <= n; y++)
            if(cap[node][y] != flow[node][y])
            {
                if(!vis[y])
                {
                    vis[y] = true;
                    t[y] = node;
                    q.push(y);

                    if(y == n)
                        return;
                }
            }
    }
}

int main()
{
    fin >> n >> m;
    for(int i = 0; i < m; i++)
    {
        int x, y, c;
        fin >> x >> y >> c;
        cap[x][y] = c;
    }

    int fmax = 0;
    do
    {
        bfs(1);

        if(vis[n] == false)
            break;

        int fmin = 1 << 30;
        for(int node = n; node != 1; node = t[node])
            fmin = min(fmin, cap[t[node]][node] - flow[t[node]][node]);
        

        fmax += fmin;
        for(int node = n; node != 1; node = t[node])
        {
            flow[t[node]][node] += fmin;
            flow[node][t[node]] -= fmin;
        }
    } while(vis[n]);

    fout << fmax << '\n';

    fin.close();
    fout.close();
    return 0;
}