Cod sursa(job #2586472)

Utilizator ivan.tudorIvan Tudor ivan.tudor Data 20 martie 2020 22:12:33
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.95 kb
#include<bits/stdc++.h>
using namespace std;
class Dinic{
private:
  int S,D;
  int N;
  struct Edge{
    int x;
    int flow;
    int cap;
    int rv;
  };
  vector<vector<Edge>> gr;
  vector<int> lvl;
  vector<int> ind;
  bool BFS_level(){
    queue<int> q;
    for(int i=1;i<=N;i++)
      lvl[i]=-1;
    q.push(S);
    lvl[S]=0;
    while(!q.empty()){
      int node=q.front();
      q.pop();
      for(auto vec:gr[node]){
        if(lvl[vec.x]==-1 && vec.flow<vec.cap){
          lvl[vec.x]=lvl[node]+1;
          q.push(vec.x);
        }
      }
    }
    if(lvl[D]!=-1)
      return true;
    return false;
  }
  int DFS_sendflow(int node,int curflow){
    if(node==D || curflow==0)
      return curflow;
    for(;ind[node]<(int)gr[node].size();ind[node]++){
      auto &vec=gr[node][ind[node]];
      if(lvl[vec.x]==lvl[node]+1 && vec.flow<vec.cap){
        curflow=DFS_sendflow(vec.x,min(curflow,vec.cap-vec.flow));
        if(curflow>0){
          vec.flow+=curflow;
          gr[vec.x][vec.rv].flow-=curflow;
          return curflow;
        }
      }
    }
    return 0;
  }
public:
  Dinic (int sz,int source,int dest){
    gr.resize(sz+1);
    S=source;
    D=dest;
    N=sz;
    lvl.resize(N+1);
    ind.resize(N+1);
  }
  void AddEdge(int x,int y,int cap){
    gr[x].push_back({y,0,cap,(int)gr[y].size()});
    gr[y].push_back({x,0,0,(int)gr[x].size()-1});
  }
  int getflow(){
    int ans=0;
    while(BFS_level()){
      for(int i=0;i<=N;i++)
        ind[i]=0;
      int flow;
      while((flow=DFS_sendflow(S,INT_MAX))>0)
        ans+=flow;
    }
    return ans;
  }
};
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;
}