Cod sursa(job #1917490)

Utilizator geo_furduifurdui geo geo_furdui Data 9 martie 2017 12:23:39
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <fstream>
#include<climits>
using namespace std;
ifstream cin ("flux.in");
ofstream cout ("flux.out");
struct bla
{
      int nod,urm;
} t[11000];
int start[1010],flux;
int used[1010],nr;
int coada[1010],tata[1010];
int n,m,cost[1010][1010];
void read ()
{ int a,b,c,k=0;
      cin>>n>>m;
      for(int i=1;i<=m;i++)
      {
            cin>>a>>b>>c;
            t[++k].nod=b; t[k].urm=start[a]; start[a]=k;
            t[++k].nod=a; t[k].urm=start[b]; start[b]=k;
            cost[a][b]=c;
      }
}
bool bfs ()
{ ++nr;
      int pi=1,ps=1;
      coada[1]=1;
      while(ps<=pi)
      {
            for(int x=start[coada[ps]];x;x=t[x].urm)
                  if(used[t[x].nod]<nr && cost[coada[ps]][t[x].nod])
                  {
                    if(t[x].nod!=n) coada[++pi]=t[x].nod;
                    used[t[x].nod]=nr;
                    tata[t[x].nod]=coada[ps];
                  } ++ps;
      }
      if(used[n]==nr) return true;
      return false;
}
void fluxx ()
{
      while(bfs())
      {
            for(int x=start[n];x;x=t[x].urm)
            {   int varf=t[x].nod,minim=INT_MAX;
                  if(used[varf]==nr && cost[varf][n]>0)
                  {
                        tata[n]=varf;
                        for(int y=n;y!=1;y=tata[y]) minim=min(minim,cost[tata[y]][y]);
                        for(int y=n;y!=1;y=tata[y]) cost[tata[y]][y]-=minim,cost[y][tata[y]]+=minim;
                        flux+=minim;
                  }
            }
      }
}
void write ()
{
      cout<<flux;
}
int main()
{
    read();
    fluxx();
    write();
    cin.close();
    cout.close();
    return 0;
}