Cod sursa(job #784770)

Utilizator ion824Ion Ureche ion824 Data 6 septembrie 2012 21:07:42
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 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];
int cd[NM],TT[NM],N,M,flow;
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;
}

void update()
{
    int min=INF,nod=N;

    while(TT[nod]!=-1)
    {
        if(C[TT[nod]][nod]<min)min=C[TT[nod]][nod];
        nod=TT[nod];
    }

    nod=N; flow+=min;

    while(TT[nod]!=-1)
    {
        C[TT[nod]][nod]-=min;
        C[nod][TT[nod]]+=min;
        nod=TT[nod];
    }
}

bool BF()
{
    int i,nod,V,ok=0;

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

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

int main()
{
    ifstream fin("maxflow.in");
    ofstream fout("maxflow.out");
    int i,x,y,z;
    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);
    }

    while(BF());

    fout<<flow;
    return 0;
}