Cod sursa(job #2879809)

Utilizator MenelausSontea Vladimir Menelaus Data 28 martie 2022 23:31:51
Problema Flux maxim Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

std::ifstream in("maxflow.in");
std::ofstream out("maxflow.out");

const int N=1000;

std::vector<int> v[N+1];
int n, m;

/// reziduu pe muchia i->j (capacitate-flux)
int c[N+1][N+1];

int parent[N+1];
int flux;
/// creeaza drum de la 1 la n pe muchii cu reziduu pozitiv
bool bfs()
{
    std::queue<std::pair<int, int>> q;

    for(int i=1; i<=n; i++) parent[i]=-1;

    parent[1]=-2;

    q.push({1, 3e5});
    while(!q.empty())
    {
        int curr=q.front().first;
        int flow_curr=q.front().second;

        for(int j : v[curr])
        {
            if(j==n)
            {
                flux=flow_curr;
                parent[n]=curr;
                return true;
            }
            if(parent[j]==-1 && c[curr][j])
            {
                parent[j]=curr;
                q.push({j, std::min(flow_curr, c[curr][j])});
            }
        }

        q.pop();
    }

    return false;
}

int main()
{
    int x, y, z;
    int ans=0;

    in>>n>>m;
    for(int i=1; i<=m; i++)
    {
        in>>x>>y>>z;
        v[x].push_back(y);
        v[y].push_back(x);
        c[x][y]=z;
    }

    while(bfs())
    {
        ans+=flux;
        int backt=n;
        while(parent[backt]!=-2)
        {
           c[parent[backt]][backt]-=flux;
           c[backt][parent[backt]]+=flux;
           backt=parent[backt];
        }
    }

    out<<ans;
}