Cod sursa(job #2677638)

Utilizator ivan.tudorIvan Tudor ivan.tudor Data 26 noiembrie 2020 23:41:38
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.81 kb
#include<bits/stdc++.h>
using namespace std;
struct Dinic{
  struct Edges{
    int x, c, f;
    int rev;
  };
  vector<vector<Edges>> gr;
  vector<int> lvl;
  vector<int> ind;
  int S, D;
  int N;
  Dinic(int n, int _s, int _d) : gr(n + 1), lvl(n + 1), ind(n+1), S(_s), D(_d), N(n){
  }
  bool bfs_level(){
    for(int i=1;i<=N;i++)
      lvl[i] = -1;
    queue<int> q;
    q.push(S);
    lvl[S] = 0;
    while(q.size()){
      int nod = q.front();
      q.pop();
      for(auto x:gr[nod]){
        if(x.f < x.c && lvl[x.x] == -1){
          lvl[x.x] = 1+ lvl[nod];
          q.push(x.x);
        }
      }
    }
    if(lvl[D] == -1)
      return false;
    return true;
  }
  int dfs_flow(int nod,int cflow){
    if(cflow == 0 || nod == D)
      return cflow;
    for(ind[nod];ind[nod] < gr[nod].size(); ind[nod]++){
      auto &e = gr[nod][ind[nod]];
      if(lvl[e.x] != lvl[nod] + 1)
        continue;
      int fl = dfs_flow(e.x, min(cflow, e.c - e.f));
      if(fl > 0){
        e.f += fl;
        gr[e.x][e.rev].f -= fl;
        return fl;
      }
    }
    return 0;
  }
  void AddEdge(int x, int y,int cap){
    int nrx = gr[x].size();
    int nry = gr[y].size();
    gr[x].push_back({y, cap, 0, nry});
    gr[y].push_back({x, 0, 0, nrx});
  }
  int GetFlow(){
    int mflow = 0;
    while(bfs_level()){
      for(int i=1;i<=N;i++)
        ind[i] = 0;
      while(int fl = dfs_flow(S, INT_MAX))
        mflow += fl;
    }
    return mflow;
  }
};
int main()
{
  FILE*fin,*fout;
  fin=fopen("maxflow.in","r");
  fout=fopen("maxflow.out","w");
  int n,m;
  fscanf(fin,"%d%d",&n,&m);
  Dinic network(n,1,n);
  for(int i=1;i<=m;i++){
    int x,y,z;
    fscanf(fin,"%d%d%d",&x,&y,&z);
    network.AddEdge(x,y,z);
  }
  fprintf(fout,"%d",network.GetFlow());
  return 0;
}