Cod sursa(job #2592973)

Utilizator anamariatoaderAna Toader anamariatoader Data 2 aprilie 2020 17:46:30
Problema Flux maxim Scor 10
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(){
    Min = inf;
    int nod = n;
    while(nod > 1){
      for(int i=0;i<g[nod].size();i++){
          int nou=g[nod][i];
          if(viz[nou] && f[nou][nod] < d[nou][nod])
            Min = min(Min, d[nou][nod] - f[nou][nod]);
      }
      nod=tata[nod];
    }
    sol += Min;
    nod = n;
    while(nod > 1){
      for(int i=0;i<g[nod].size();i++){
          int nou=g[nod][i];
          if(viz[nou] && f[nou][nod] < d[nou][nod]){
            f[nou][nod] += Min;
            f[nod][nou] -= Min;
          }
      }
      nod=tata[nod];
    }
}

void bfs(int nod){
    q.push(1);
    viz[1]=1;
    while(!q.empty()){
        int nod = q.front();
        q.pop();
        if(nod == n){
            calculez();
            return;
        }
        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;
            }
        }
    }
}

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;
}