Cod sursa(job #2805092)

Utilizator As932Stanciu Andreea As932 Data 21 noiembrie 2021 13:29:03
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#include <bits/stdc++.h>
#define inf 1e9

using namespace std;

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

const int nmax = 1e3 + 5;

int n, m;
bool vis[nmax];
int c[nmax][nmax], f[nmax][nmax], tt[nmax];
vector <int> v[nmax];

void read(){
    fin >> n >> m;

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

bool bfs(){
    vector <int> q;
    memset(vis, 0, sizeof(vis));

    q.push_back(1);
    vis[1] = true;

    for(int i = 0; i < q.size(); i++){
        int node = q[i];

        if(node == n)
            continue;

        for(int j = 0; j < v[node].size(); j++){
            int ngh = v[node][j];
            if(c[node][ngh] == f[node][ngh] || vis[ngh])
                continue;
            vis[ngh] = true;
            q.push_back(ngh);
            tt[ngh] = node;
        }
    }

    return vis[n];
}

void solve(){
    int flow = 0, flowMin;

    while(bfs())
        for(int i = 0; i < v[n].size(); i++){
            int node = v[n][i];

            if(f[node][n] == c[node][n] || !vis[node])
                continue;

            tt[n] = node;
            flowMin = inf;

            for(node = n; node != 1; node = tt[node])
                flowMin = min(flowMin, c[tt[node]][node] - f[tt[node]][node]);

            if(flowMin == 0)
                continue;

            for(node = n; node != 1; node = tt[node]){
                f[tt[node]][node] += flowMin;
                f[node][tt[node]] -= flowMin;
            }

            flow += flowMin;
        }

    fout << flow;
}

int main()
{
    read();
    solve();

    return 0;
}