Cod sursa(job #2962636)

Utilizator witekIani Ispas witek Data 8 ianuarie 2023 21:53:45
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#include <bits/stdc++.h>

using namespace std;
const int NMAX = 1000;

int cost[NMAX + 5][NMAX + 5];
bool viz[NMAX + 5];

int BFS(int node, int n, int &ans, vector<vector<int>> &G, int maxFlow) {
    if(node == n) {
        ans += maxFlow;
        return maxFlow;
    }

    viz[node] = 1;

    int totalFlow = 0;

    for(auto &adj : G[node]) {
        if(maxFlow == 0)
            return totalFlow;

        if(viz[adj] || !cost[node][adj])
            continue;

        int currFlow = BFS(adj, n, ans, G, min(maxFlow, cost[node][adj]));
        cost[node][adj] -= currFlow;
        cost[adj][node] += currFlow;
        totalFlow += currFlow;
        maxFlow = maxFlow - currFlow;
    }

    return totalFlow;
}

void DFS(int node, vector<vector<int>> &G) {
    viz[node] = 1;

    for(auto &adj : G[node])
        if(cost[node][adj] && !viz[node])
            DFS(adj, G);
}

int main()
{
    //ios::sync_with_stdio(false);
    ifstream fin("maxflow.in");
    ofstream fout("maxflow.out");
    fin.tie(0);
    fout.tie(0);

    int n, m;

    fin >> n >> m;

    vector<vector<int>> G(n + 1, vector<int>());

    for(int i = 1; i <= m; i++) {
        int a, b, c;

        fin >> a >> b >> c;

        G[a].push_back(b);
        G[b].push_back(a);

        cost[a][b] = c;
    }

    int ans = 0;

    while(BFS(1, n, ans, G, 1e9)) {
        for(int i = 1; i <= n; i++)
            viz[i] = 0;
    }

    /* for(int i = 1; i <= n; i++)
         viz[i] = 0;

     DFS(1, G);

     for(int i = 1; i <= n; i++)
         if(viz[i])
             for(auto &adj: G[i])
                 if(!viz[adj])
                     cout << i << " - " << adj << '\n';*/

    fout << ans;

    fin.close();
    fout.close();

    return 0;
}