Cod sursa(job #2695926)

Utilizator TaveNeagoe Gabriel-Octavian Tave Data 14 ianuarie 2021 21:20:13
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
	
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>

#define nmax 1005
#define inf 1e9

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

bool viz[nmax];
int n ,m;
int G[nmax][nmax], r[nmax][nmax], parent[nmax];
vector<int> g[nmax];
 
//functie pentru a determina daca exista un drum de la s la d in graful rezidual
bool bfs (int s,  int d){
 
    for(int i=1; i<=n; i++){
        viz[i] = false;
    }
 
    viz[s] = true;
    parent[s] = -1;

    queue<int> q;
    q.push(s);
 
    while(!q.empty()){
        auto now = q.front();
        q.pop();
 
        for(auto next: g[now]){
            if(viz[next] == false && r[now][next] >0){
                if (next != d){
                    q.push(next);
                }
                viz[next] = true;
                parent[next] = now;
            }
        }
    }
 
    return (viz[d] == true);
}
 
 
 
int main() {

    int src, dest, capacitate, max_flow, j;
    fin>>n>>m;
    for(int i=0;i<m;i++)
    {
        fin>>src>>dest>>capacitate;
        g[src].push_back(dest);
        g[dest].push_back(src);
        r[src][dest] = capacitate;
 
    }
 
    
 
    while (bfs(1, n))
    {
        for (auto i : g[n])
        {
            if (viz[i] && r[i][n]){
                
            int aux = inf;
            parent[n] = i;

            for (j=n; j!=1; j=parent[j])
                aux = min(aux, r[parent[j]][j]);
                
            for (j=n; j!=1; j=parent[j])
            {
                r[parent[j]][j] -= aux;
                r[j][parent[j]] += aux;
            }
            max_flow += aux;
            }
        }
    }
 
    fout<<max_flow;