Cod sursa(job #3259974)

Utilizator mmocanuMocanu Mihai-Adrian mmocanu Data 28 noiembrie 2024 17:27:04
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <queue>
#define MAXN 1003
#define INFI 1000'000'009
using namespace std;

vector <int> graf[MAXN];

int much[MAXN][MAXN];
int sens[MAXN];
queue <int> q;
int n,m;

void MakeSens(int node){

  q.push(node);
  while(!q.empty()){
    node=q.front();
    q.pop();
    for(int neigh : graf[node]){
      if(much[node][neigh]>0 && sens[neigh]==0){
        sens[neigh]=sens[node]+1;
        q.push(neigh);
      }
    }
  }
}

int DFS(int node,int mi){
  int aux;

  if(node==n){
    return mi;
  }

  for(int neigh : graf[node]){
    if(much[node][neigh]>0 && sens[neigh]==sens[node]+1){
      aux=DFS(neigh,min(mi,much[node][neigh]));
      if(aux!=-1){
        much[node][neigh]-=aux;
        much[neigh][node]+=aux;
        return aux;
      }
    }
  }

  return -1;
}

int main(){
  int i,a,b,val,aux,s,exi;
  FILE *fin,*fout;
  fin=fopen("maxflow.in","r");
  fout=fopen("maxflow.out","w");

  fscanf(fin,"%d%d",&n,&m);

  for(i=0;i<m;i++){
    fscanf(fin,"%d%d%d",&a,&b,&val);
    much[a][b]=val;
    graf[a].push_back(b);
    graf[b].push_back(a);
  }

  s=0;
  exi=1;
  while(exi==1){
    for(i=1;i<=n;i++){
      sens[i]=0;
    }
    sens[1]=1;
    MakeSens(1);
    exi=0;
    aux=1;
    while(aux>0){
      aux=DFS(1,INFI);
      if(aux>0){
        s+=aux;
        exi=1;
      }
    }
  }

  fprintf(fout,"%d\n",s);

  fclose(fin);
  fclose(fout);
  return 0;
}