Cod sursa(job #3227091)

Utilizator xXoctavianXxStanescu Matei Octavian xXoctavianXx Data 25 aprilie 2024 12:28:58
Problema Flux maxim Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <bits/stdc++.h>

using namespace std;

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

const int inf = 1e9;
const int nmax = 1005;
int cap[nmax][nmax],flow[nmax][nmax];
vector<int> adj[nmax];
int tata[nmax];

int n,m;

int bfs(int start)
{
    vector<int> viz(n+1);
    queue<int> q;
    q.push(start);
    while(!q.empty())
    {
        int i = q.front();
        q.pop();
        if(i == n) continue;
        for(auto pi: adj[i])
        {
            if(!viz[pi] && flow[i][pi] < cap[i][pi])
            {
                viz[pi] = 1;
                q.push(pi);
                tata[pi] = i;
            }
        }
    }
    return viz[n];
}


int main()
{
    fin>>n>>m;
    for(int i=1; i<=m; i++)
    {
        int a,b,c;
        fin>>a>>b>>c;
        adj[a].push_back(b);
        adj[b].push_back(a);
        cap[a][b] = c;
        cap[b][a] = -c;
    }
    int flux = 0;
    while(bfs(1))
    {
        for(auto dest : adj[n])
        {
            tata[n] = dest;
            int path_flow = inf;
            for(int i=n; i != 1; i= tata[i])
            {
                path_flow = min(path_flow, cap[tata[i]][i] - flow[tata[i]][i]);
            }
            if(path_flow == 0) continue;
            for(int i=n; i != 1; i= tata[i])
            {
                flow[tata[i]][i] += path_flow;
                flow[i][tata[i]] -= path_flow;
            }
            flux += path_flow;
        }
    }
    fout<<flux;
    return 0;
}