Cod sursa(job #2461798)

Utilizator MortemPlaiasu Iulia-Silvia Mortem Data 26 septembrie 2019 10:09:45
Problema Flux maxim Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
struct edge
{
  int d,c;
};

int n,m;

bool vis[1500];
int p[1500];
vector<int> v[1500];
int maxCap[1500][1500];
int usedCap[1500][1500];
int minn[1500];
int sum;
int main()
{
  fin>>n>>m;
  for(int i=0;i<m;i++)
  {
    int j,k,c;
    fin>>j>>k>>c;
    v[j].push_back(k);
    maxCap[j][k]=c;
  }
  while(true)
  {
    for(int i=1;i<=n;i++)
    {
      minn[i]=INT_MAX;
      vis[i]=false;
    }
    queue<int> q=queue<int>();
    q.push(1);
    vis[1]=true;
    while(!q.empty()&&q.back()!=n)
    {
      int tp= q.front();
      for(vector<int>::iterator it=v[tp].begin(); it!= v[tp].end();++it )
        if(!vis[(*it)]&&usedCap[tp][(*it)]<maxCap[tp][(*it)])
        {
      //    cout<<":"<<*it<<" ";
          q.push((*it));
          vis[*it]=true;
          minn[*it]=min(minn[tp],maxCap[tp][*it]-usedCap[tp][*it]);
          p[*it]=tp;
          if(*it==n) break;
        }
    //  cout<<"\n"<<tp<<"\n";
      q.pop();
    }
  //  cout<<minn[n]<<" done\n";
    if(!q.empty())
    {
      int nod=n;
      sum+=minn[n];
      while(nod!=1)
      {
        usedCap[p[nod]][nod]+=minn[n];
        usedCap[nod][p[nod]]-=minn[n];
        nod=p[nod];
      }
    }
    else break;
  }
  fout<<sum<<"\n";
}