Cod sursa(job #529508)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 5 februarie 2011 12:52:49
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include<iostream.h>
#include<fstream.h>
#define INF 1000000
#define N 1001
#define M 5001
int n,m,i,j,k,deg[N]={0},g1[N][N],l,t,b[M],c[M],e[M];
long capac,flow[N][N]={0},d[N],g2[N][N];

long min(long a,long b)
{if(a<b)
       return a;
return b;}

long EK(int g1[N][N],long g2[N][N],int deg[N],int n,int source,int sink,long flow[N][N],long d[N])
{long pre[N],que[N],p,q,t,i,j,k,l,r,v1[N],v2[N],w=1;
while(1)       
       {for(k=1;k<=n;k++)
              pre[k]=-1;
       d[source]=INF;
       p=0;
       q=0;
       que[q++]=source;
       while(p<q&&pre[sink]<0)
              {t=que[p++];
              for(i=1;i<=deg[t];i++)
              if(pre[g1[t][i]]<0&&(j=g2[t][g1[t][i]]-flow[t][g1[t][i]])!=0)
                     {pre[que[q++]=g1[t][i]]=t;
                     d[g1[t][i]]=min(d[t],j);}}
       if(pre[sink]<0) 
              break;
       for(l=sink;l!=source;l=pre[l])
              {flow[pre[l]][l]+=d[sink];
              deg[pre[l]]++;
              g1[pre[l]][deg[pre[l]]]=l;
              deg[l]++;
              g1[l][deg[l]]=pre[l];
              flow[l][pre[l]]-=d[sink];}}
j=0;
for(i=1;i<=n;i++)
       j+=flow[source][i];
return j;}

int main()
{ifstream f1("maxflow.in");
ofstream f2("maxflow.out");
f1>>n>>m;
for(k=1;k<=m;k++)
     {f1>>b[k]>>c[k]>>e[k];
     deg[b[k]]++;
     g1[b[k]][deg[b[k]]]=c[k];
     g2[b[k]][c[k]]=e[k];}
f2<<EK(g1,g2,deg,n,1,n,flow,d)<<endl;     
f1.close();
f2.close();
return 0;}