Cod sursa(job #3145160)

Utilizator alex_cosmin005Ciotirnae Alexandru alex_cosmin005 Data 13 august 2023 12:57:30
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include<fstream>
#include<vector>
#include<queue>

using namespace std;

ifstream cin("maxflow.in");
ofstream cout("maxflow.out");

int n,m;
vector <int> v[1001]; ///muchiile
int c[1001][1001]; ///capacitatea fiecarei muchii
int f[1001][1001]; ///fluxul fiecarei muchii
int tt[1001]; ///arborele pentru drumuri

int ok[1001]; ///vectorul "vizitat"
queue <int> ord;

int flow,fmin;

void citire(){
    cin>>n>>m;
    int ii,jj,g;
    for(int i=1;i<=m;i++){
        cin>>ii>>jj>>g;
        v[ii].push_back(jj);
        v[jj].push_back(ii);
        c[ii][jj]=g;
    }
}
int bfs(int start){
    for(int i=1;i<=n;i++)
        ok[i]=0;
    ok[start]=1;
    ord.push(start);
    while(!ord.empty()){
        int elem1=ord.front();
        for(unsigned int i=0;i<v[elem1].size();i++){
            int elem2=v[elem1][i];
            if(c[elem1][elem2] != f[elem1][elem2] && ok[elem2] == 0){
                ok[elem2]=1;
                ord.push(elem2);
                tt[elem2]=elem1;
                if(elem2==n){
                    while(!ord.empty())
                        ord.pop();
                    return 1;
                }
            }
        }
        ord.pop();
    }
    return 0;
}
void maxflow(){
    for(flow=0; bfs(1); flow+=fmin){
        fmin=1000000;
        for(int i=n;i!=1;i=tt[i])
            fmin=min(fmin, c[tt[i]][i] - f[tt[i]][i]);
        for(int i=n;i!=1;i=tt[i]){
            f[tt[i]][i]+=fmin;
            f[i][tt[i]]-=fmin;
        }
    }
}
int main(){
    citire();
    maxflow();
    cout<<flow;
}