Cod sursa(job #2462749)

Utilizator MortemPlaiasu Iulia-Silvia Mortem Data 27 septembrie 2019 19:42:46
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <stdio.h>
#include <vector>
#include <string.h>

#define INF 0x3f3f3f3f
using namespace std;
 
int n,m;
 
bool vis[1024];
int p[1024];
vector<int> v[1024];
int maxCap[1024][1024];
int usedCap[1024][1024];
int q[1024];

int BF()
{
  int i,tp,j,it;
  memset(vis, 0, sizeof(vis));
  q[0]=1;
  q[1]=1;
  vis[1]=1;
  for(i=1;i<=q[0];i++)
  {
    tp= q[i];
    if(tp==n) continue;
    for(j=0; j<v[tp].size();++j )
    {
      it=v[tp][j];
      if(vis[(it)]||usedCap[tp][(it)]==maxCap[tp][(it)]) continue;
    //    cout<<":"<<*it<<" ";
      q[++q[0]]=it;
      vis[it]=true;
      p[it]=tp;
        
    //  cout<<"\n"<<tp<<"\n";
    }
  }
  return vis[n];
}

long sum;
int main()
{
  freopen("maxflow.in", "r", stdin);
  freopen("maxflow.out", "w", stdout);
  scanf("%d %d",&n,&m);
  int i,j,k,c;
  for(i=0;i<m;i++)
  {
    scanf("%d %d %d",&j,&k,&c);
    v[j].push_back(k);
    v[k].push_back(j);
 
    maxCap[j][k]+=c;
  }
  int currentN,low,nod;
  while(BF())
  {	
  //  cout<<low<<" done\n";
    for(j=0;j<v[n].size();j++)
    {
      currentN= v[n][j];
      if(maxCap[currentN][n]==usedCap[currentN][n]|| !vis[currentN]) continue;
      p[n]=currentN;
      low=INF;
      for(nod=n;nod!=1;nod=p[nod])
        low= min(low,maxCap[p[nod]][nod]-usedCap[p[nod]][nod]);
      if(low==0) continue;
      sum+=low;
      for(nod=n;nod!=1;nod=p[nod])
      {
        usedCap[p[nod]][nod]+=low;
        usedCap[nod][p[nod]]-=low;
      }
    }
  }
  printf("%ld\n",sum);
}