Cod sursa(job #719210)

Utilizator ioalexno1Alexandru Bunget ioalexno1 Data 21 martie 2012 16:47:37
Problema Flux maxim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <cstdio>
#define N 1005
#define inf 1999999999
using namespace std;
struct nod{ int val; nod *urm; }*G[N],*GT[N];
int n,m,maxflow;
int st[N],viz[N],fm[N],k,pas,c[N][N],flux[N][N];
void read()
{ nod *aux;
  int i,x,y,z;
freopen("maxflow.in","r",stdin); scanf("%d %d\n",&n,&m);
for(i=1;i<=m;++i)
    {
    scanf("%d %d %d\n",&x,&y,&z);
    c[x][y]=z;
    aux=new nod; aux->val=y; aux->urm=G[x]; G[x]=aux;
    aux=new nod; aux->val=x; aux->urm=GT[y]; GT[y]=aux;
    }
fclose(stdin);
}
inline int min(int x,int y)
{
if(x<y)return x; else return y; return 0;
}
int drum_amel_df()
{ bool dr,gasit;
  nod *aux;
k=1; st[1]=1; fm[1]=inf; viz[1]=pas; dr=false;
while(k>0&&!dr)
    {
    gasit=false;
    for(aux=G[st[k]];aux!=NULL&&!gasit;aux=aux->urm)
        if(viz[aux->val]!=pas&&c[st[k]][aux->val]>flux[st[k]][aux->val])
                {
                st[++k]=aux->val; viz[aux->val]=pas; gasit=true;
                if(aux->val==n)dr=true;
                fm[k]=min(fm[k-1],c[st[k-1]][aux->val]-flux[st[k-1]][aux->val]);
                }
    if(!gasit)--k;
    }
if(dr)return 1;
return 0;
}
void solve()
{ int i;
pas=1;
while(drum_amel_df())
    {
    for(i=1;i<k;++i)
        flux[st[i]][st[i+1]]+=fm[k];
    maxflow+=fm[k];
    ++pas;
    }
}
int main()
{
read();
maxflow=0;
solve();
freopen("maxflow.out","w",stdout); printf("%d",maxflow); fclose(stdout);
return 0;
}