Cod sursa(job #784426)

Utilizator ion824Ion Ureche ion824 Data 5 septembrie 2012 18:36:32
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <fstream>
#include <cstring>

using namespace std;

const int NM = 1003;
const int INF= 0x3f3f3f3f;

typedef struct lnod{
     int vf;
     struct lnod *next;
           }*Nod;

int C[NM][NM],F[NM][NM];
int cd[NM],TT[NM],N,M;
bool viz[NM];
Nod a[NM];

inline int min(int a,int b){ return a<b?a:b; }

void add(Nod &q,int x)
{
    Nod p=new lnod;
    p->vf=x;
    p->next=q;
    q=p;
}

bool BF()
{
    int i,nod,V;

    cd[0]=cd[1]=1;
    memset(viz,0,sizeof(viz));
    viz[1]=1;

    for(i=1; i<=cd[0]; ++i)
    {
      nod=cd[i];
      if(nod != N)
        for(Nod p=a[nod];p;p=p->next)
        {
          V=p->vf;
          if(!viz[V] && C[nod][V]!=F[nod][V])
          {
             viz[V]=1;
             cd[++cd[0]]=V;
             TT[V]=nod;
          }
        }
    }
  return viz[N];
}

int main()
{
    ifstream fin("maxflow.in");
    ofstream fout("maxflow.out");
    int i,x,y,z,flow,nod,fmin;
    fin>>N>>M;
    for(i=1;i<=M;++i)
    {
        fin>>x>>y>>z;
        C[x][y]=z;
        add(a[x],y);
        add(a[y],x);
    }

    for(flow=0; BF(); )
      for(Nod p=a[N];p;p=p->next)
      {
         nod=p->vf;
         if(C[nod][N] != F[nod][N] && viz[nod])
         {
             TT[N]=nod; fmin=INF;
             for(nod=N; nod!=1; nod=TT[nod])
               fmin = min(fmin,C[ TT[nod] ][nod] - F[ TT[nod] ][nod] );

             if(fmin)
             {
               for(nod = N; nod!=1 ; nod=TT[nod])
               {
                 F[ TT[nod] ][nod] += fmin;
                 F[nod][ TT[nod] ] -= fmin;
               }
               flow += fmin;
             }
         }
      }

    fout<<flow;
    return 0;
}