Cod sursa(job #2593003)

Utilizator anamariatoaderAna Toader anamariatoader Data 2 aprilie 2020 18:10:13
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include <fstream>
#include <queue>
#include <cstring>
#define inf 2000000000

using namespace std;

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

int n,m,x,y,c,i,Min,sol;
bool viz[1005];
int d[1005][1005],f[1005][1005],tata[1005];
vector <int> g[1005];
queue <int> q;

void calculez(){
      for(int i=0;i<g[n].size();i++){
          int nod=g[n][i];
          if(viz[nod] && f[nod][n] < d[nod][n]){
             int Min=d[nod][n]-f[nod][n];
              while(nod!=1){
                 Min = min(Min, d[tata[nod]][nod] - f[tata[nod]][nod]);
                 nod=tata[nod];
          }
          sol+=Min;
          nod=g[n][i];
          f[nod][n]+=Min;
          f[n][nod]-=Min;
          while(nod!=1){
              f[tata[nod]][nod]+=Min;
              f[nod][tata[nod]]-=Min;
              nod=tata[nod];
          }
        }
    }
}


void bfs(int nod){
    q.push(1);
    viz[1]=1;
    while(!q.empty()){
        int nod = q.front();
        q.pop();

        for(int i=0;i<g[nod].size();i++){
            int nou = g[nod][i];
            if(!viz[nou] && f[nod][nou] < d[nod][nou]){
                viz[nou]=1;
                q.push(nou);
                tata[nou]=nod;
            }
        }
    }

     if(viz[n]){
        calculez();
        return;
    }
}

int main()
{
    fin>>n>>m;
    for(i=1;i<=m;i++){
        fin>>x>>y>>c;
        d[x][y]=c;
        g[x].push_back(y);
        g[y].push_back(x);
    }
    viz[n]=1;
    while(viz[n]){
        memset(viz,0,sizeof(viz));
        memset(tata,0,sizeof(tata));
        while(!q.empty())
            q.pop();
        bfs(1);
    }
    fout<<sol;
   return 0;
}