Cod sursa(job #2657849)

Utilizator mjmilan11Mujdar Milan mjmilan11 Data 12 octombrie 2020 14:08:31
Problema Flux maxim Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
const int NMAX = 1005;
const int INF = (1<<29);
int f[NMAX][NMAX],c[NMAX][NMAX],tata[NMAX];
int n,m,x,y,z,rasp=0;
bool ver[NMAX];
vector <int> v[NMAX];
queue <int> q;
bool bfs(){
    for(int i=1;i<=n;i++) ver[i]=false;
    ver[1]=true;
    q.push(1);
    while(!q.empty()){
        int node=q.front();
        q.pop();
        if(node==n) continue;
        for(int i=0;i<v[node].size();i++){
            int vecin=v[node][i];
            if(ver[vecin]==false and c[node][vecin]>f[node][vecin]){
                q.push(vecin);
                tata[vecin]=node;
                ver[vecin]=true;
                if(vecin==n) return 1;
            }
        }
    }
    if(ver[n]==true) return 1;
    return 0;
}
int main()
{
    fin >> n >> m;
    for(int i=1;i<=m;i++){
        fin >> x >> y >> z;
        v[x].push_back(y);
        v[y].push_back(x);
        c[x][y]=z,c[y][x]=0;
    }
    while(bfs()==true){
        for(int i=0;i<v[n].size();i++){
            int nod=v[n][i];
            if(ver[nod]==true and c[nod][n]>f[nod][n]){
                int minim=INF;
                int aux=n;
                while(tata[aux]!=0){
                    int t=tata[aux];
                    if(c[t][aux]-f[t][aux]<minim)
                        minim=c[t][aux]-f[t][aux];
                    aux=t;
                }
                if(minim==0) continue;
                rasp+=minim;
                aux=n;
                while(tata[aux]!=0){
                    int t=tata[aux];
                    f[t][aux]+=minim;
                    f[aux][t]-=minim;
                    aux=t;
                }
            }
        }
    }
    fout << rasp;
    return 0;
}