Cod sursa(job #1891822)

Utilizator geo_furduifurdui geo geo_furdui Data 24 februarie 2017 12:49:48
Problema Flux maxim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>
#include<climits>
using namespace std;
ifstream cin ("maxflow.in");
ofstream cout ("maxflow.out");
int n, k, m, start[5010], tata[1010], coada[1010], cost[1010][1010], viz[1010], nr , flux,vecini[1010],p;
struct bla
{
  int nod, urm;
} t[1010];
void read ()
{
  int a, b, c;
  cin >> n >> m;
  for(int i = 1; i <= m; i++)
  {
    cin >> a >> b >> c; if(b==n) vecini[++p]=a;
    t[++k].nod = b;
    t[k].urm = start[a];
    start[a] = k;
    cost[a][b] = c;
  }
}
bool bfs ()
{
  int ps = 1, pi = 1;
  coada[1] = 1;
  tata[1] = -1;
  viz[1] = nr;
  while(ps <= pi)
  {
    int x = start[coada[ps]];
    while(x)
    {
      if(viz[t[x].nod] < nr && cost[coada[ps]][t[x].nod] > 0)
      {
        coada[++pi] = t[x].nod, tata[t[x].nod] = coada[ps], viz[t[x].nod] = nr;
        if(t[x].nod == n) return true;
      }
      x = t[x].urm;
    } ++ps;
  }
  return false;
}
void solve_here ()
{
  nr = 1;
  while(bfs())
  {
     for(int i=1;i<=p;i++)
     {
       int x=vecini[i],minim=INT_MAX;
       if(viz[x]==nr)
       {
       while(tata[x]!=-1)
       {
         if(cost[tata[x]][x]<minim) minim=cost[tata[x]][x]; x=tata[x];
       }
        x=vecini[i];
       while(tata[x]!=-1)
       {
         cost[tata[x]][x]-=minim; x=tata[x];
       }
       flux+=minim;
       }
     } ++nr;
  }
}
void write ()
{
  cout << flux;
}
int main()
{
  read();
  solve_here();
  write();
  cin.close();
  cout.close();
  return 0;
}