Cod sursa(job #2462725)

Utilizator MortemPlaiasu Iulia-Silvia Mortem Data 27 septembrie 2019 19:09:27
Problema Flux maxim Scor 70
Compilator cpp-32 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <iostream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;
 
int n,m;
 
bool vis[1500];
int p[1500];
vector<int> v[1500];
int maxCap[1500][1500];
int usedCap[1500][1500];
int q[1500];

int sum;
int main()
{
	freopen("maxflow.in", "r", stdin);
	freopen("maxflow.out", "w", stdout);
  scanf("%d %d",&n,&m);
  for(int i=0;i<m;i++)
  {
    int j,k,c;
    scanf("%d %d %d",&j,&k,&c);
    v[j].push_back(k);
    v[k].push_back(j);
 
    maxCap[j][k]+=c;
  }
  while(true)
  {
    for(int i=1;i<=n;i++)
      vis[i]=false;
    q[0]=1;
    q[1]=1;
    vis[1]=true;
    for(int i=1;i<=q[0];i++)
    {
      int tp= q[i];
      for(vector<int>::iterator it=v[tp].begin(); it!= v[tp].end();++it )
        if(!vis[(*it)]&&usedCap[tp][(*it)]<maxCap[tp][(*it)])
        {
      //    cout<<":"<<*it<<" ";
          if(*it!=n)
            q[++q[0]]=*it;
          vis[*it]=true;
          p[*it]=tp;
        }
    //  cout<<"\n"<<tp<<"\n";
    }
  //  cout<<low<<" done\n";
    if(vis[n])
    {
      for(int j=0;j<v[n].size();j++)
      {
        int currentN= v[n][j];
        if(maxCap[currentN][n]==usedCap[currentN][n]|| !vis[currentN]) continue;
        int low=INT_MAX;
        for(int 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(int nod=n;nod!=1;nod=p[nod])
        {
          usedCap[p[nod]][nod]+=low;
          usedCap[nod][p[nod]]-=low;
        }
      }
    }
    else break;
  }
  printf("%d\n",sum);
}