Cod sursa(job #2417269)

Utilizator RazvanPanaiteRazvan Panaite RazvanPanaite Data 29 aprilie 2019 13:22:20
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <bits/stdc++.h>
#define DMAX 1010

using namespace std;

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

vector <int> V[DMAX];
int cap[DMAX][DMAX];

bool uz[DMAX];
int tata[DMAX];

int n,maxim;

inline int minim(int x,int y){
    if(x<y)
       return x;
    return y;
}

bool bfs();

int main(){
    int m,i,x,y,z,ii;
    int flow;
    fin>>n>>m;
    for(i=1;i<=m;i++){
        fin>>x>>y>>z;
        V[x].push_back(y);
        V[y].push_back(x);
        cap[x][y]=z;
    }
    while(bfs()){
        for(auto& i:V[n])
            if(uz[i] && cap[i][n]>0){
               flow=INT_MAX/2;
               tata[n]=i;
               for(ii=n;ii!=1;ii=tata[ii])
                   flow=minim(flow,cap[tata[ii]][ii]);
               for(ii=n;ii!=1;ii=tata[ii]){
                   cap[tata[ii]][ii]-=flow;
                   cap[ii][tata[ii]]+=flow;
               }
               maxim+=flow;
            }
    }
    fout<<maxim<<'\n';
    return 0;
}
bool bfs(){
    queue <int> C;
    int node;

    memset(uz,0,sizeof(uz));
    uz[1]=true;
    C.push(1);
    while(!C.empty()){
          node=C.front();
          C.pop();
          for(auto& i:V[node])
              if(!uz[i] && cap[node][i]>0){
              uz[i]=true;
              tata[i]=node;
              if(i!=n)
                 C.push(i);
          }
    }
    return uz[n];
}