Cod sursa(job #2497942)

Utilizator ivan.tudorIvan Tudor ivan.tudor Data 23 noiembrie 2019 12:42:18
Problema Flux maxim Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int N=1005;
vector<int> gr[N];
int cap[N][N];
int flow[N][N];
int q[N*N];
int parent[N];
bool bfs(int n){
  int st=0,dr=-1;
  q[++dr]=1;
  parent[1]=1;
  memset(parent,0,(n+5)*sizeof(int));
  while(st<=dr){
    int nod=q[st++];
    if(nod==n)
      return true;
    for(auto i:gr[nod]){
      if(i!=nod && cap[nod][i]-flow[nod][i]>0 && parent[i]==0){
        parent[i]=nod;
        q[++dr]=i;
      }
    }
  }
  return false;
}
int drum(int n){
  int tata=parent[n],nod=n,mini=1<<30;
  while(nod != 1){
    mini=min(mini,cap[tata][nod]-flow[tata][nod]);
    nod=tata;
    tata=parent[tata];
  }
  return mini;
}
void actualizeaza(int n,int flux){
  int tata=parent[n],nod=n;
  while(nod != 1){
    flow[tata][nod]+=flux;
    flow[nod][tata]-=flux;
    nod=tata;
    tata=parent[tata];
  }
}
int main()
{
  FILE*fin,*fout;
  fin=fopen("maxflow.in","r");
  fout=fopen("maxflow.out","w");
  int n,m;
  fscanf(fin,"%d%d",&n,&m);
  for(int i=1;i<=m;i++){
    int x,y,val;
    fscanf(fin,"%d%d%d",&x,&y,&val);
    gr[x].push_back(y);
    gr[y].push_back(x);
    cap[x][y]=val;
  }
  int rez=0;
  while(bfs(n)){
    for(auto i:gr[n]){
      if(cap[i][n]-flow[i][n]>0){
        parent[n]=i;
        int f=drum(n);
        actualizeaza(n,f);
        rez+=f;
      }
    }

  }
  fprintf(fout,"%d",rez);
  return 0;
}