Cod sursa(job #2936819)

Utilizator butasebiButa Gabriel-Sebastian butasebi Data 9 noiembrie 2022 16:50:55
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.37 kb
#include<bits/stdc++.h>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int n, m, ii, tt, i, x, y, c, flow[1005][1005], capacity[1005][1005], rez, dad[1005], curr, final_rez;
struct edge
{
    int dest, cap;
}aux, aux1;
vector <edge> v[1005];
bool seen[1005];
int BFS(int start)
{
    memset(seen, false, sizeof(seen));
    seen[start] = true;
    stack <edge> Q;
    aux.dest = start;
    aux.cap = INT_MAX;
    Q.push(aux);
    while(!Q.empty())
    {
        aux = Q.top();
        Q.pop();
        for(int i = 0; i < v[aux.dest].size(); i ++)
        {
            //cout << "seen = " << seen[v[aux.dest][i].dest] << " capacity = " << capacity[aux.dest][v[aux.dest][i].dest] << " flow = " << flow[aux.dest][v[aux.dest][i].dest] << "\n";
            if (!seen[v[aux.dest][i].dest] && flow[aux.dest][v[aux.dest][i].dest] < capacity[aux.dest][v[aux.dest][i].dest])
            {
                //cout << aux.dest << " " << v[aux.dest][i].dest << "\n";
                dad[v[aux.dest][i].dest] = aux.dest;
                seen[v[aux.dest][i].dest] = true;
                aux1.dest = v[aux.dest][i].dest;
                aux1.cap = min(capacity[aux.dest][v[aux.dest][i].dest] - flow[aux.dest][v[aux.dest][i].dest], aux.cap);
                Q.push(aux1);
                if (v[aux.dest][i].dest == n)
                    return min(capacity[aux.dest][v[aux.dest][i].dest] - flow[aux.dest][v[aux.dest][i].dest], aux.cap);
            }
        }
    }
    return 0;
}
void read()
{
    f >> n >> m;
    for(i = 1; i <= m; i ++)
    {
        f >> x >> y >> c;
        aux.dest = y;
        aux.cap = c;
        v[x].push_back(aux);

        aux.dest = x;
        aux.cap = c;
        v[y].push_back(aux);
        capacity[x][y] = aux.cap;
    }
}
void solve()
{
    while(true)
    {
        //cout << capacity[3][2] << "\n";
        rez = BFS(1);

        if(rez == 0)
            break;

        curr = n;
        while(curr != 1)
        {
            //cout << "Dad of " << curr << " is " << dad[curr] << "\n";
            flow[dad[curr]][curr] += rez;
            flow[curr][dad[curr]] -= rez;
            curr = dad[curr];
        }
        final_rez += rez;
    }
}
void write()
{
    g << final_rez << "\n";
    f.close();
    g.close();
}
int main()
{
    //cin >> tt;
    tt = 1;
    for(ii = 1; ii <= tt; ii ++)
    {
        read();
        solve();
        write();
    }
    return 0;
}