Cod sursa(job #1685941)

Utilizator Julian.FMI Caluian Iulian Julian. Data 11 aprilie 2016 22:33:55
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <iostream>
#include <fstream>
#define nmax 1014
#define inf 299999999
using namespace std;
long c[nmax][nmax],f[nmax][nmax];
int g[nmax][nmax];
int n,s,d,q[nmax],viz[nmax],l[nmax];

int abs(int x){if(x>0)return x;return -x;}
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int bfs(int x)
{int in,sf,i,y,v;
in=sf=0;
q[in]=x;
viz[x]=1;
  while(in<=sf && !viz[d])
    {y=q[in++];
    for(i=1;i<=g[y][0];i++)
        {v=g[y][i];
        if(c[y][v]==f[y][v] || viz[v])continue;
        viz[v]=y;
        q[++sf]=v;
        }
    }
return !viz[d];
}

void ek()
{int i,lg,j;
 long v;
    while(1)
    {
        for(i=1;i<=n;i++)viz[i]=0;
        if(bfs(1))return;

        for(i=1;i<=g[n][0];i++)
        {j=g[n][i];
          if(f[j][n]==c[j][n] || !viz[j])continue;
         viz[n]=j;
         lg=0;
         l[0]=d;
         v=inf;
         while(l[lg]!=s)
        { l[++lg]=viz[l[lg-1]];
          v=min(v,c[l[lg]][l[lg-1]]-f[l[lg]][l[lg-1]]);
        }

        while(lg)
        {f[l[lg]][l[lg-1]]+=v;
         f[l[lg-1]][l[lg]]-=v;
           lg--;
        }
        }

    }
}


int main()
{int m,i,x,y,cap;

    fin>>n>>m;
    s=1;d=n;
    for(i=1;i<=m;i++)
    {
        fin>>x>>y>>cap;
        c[x][y]=cap;
        g[x][0]++;
        g[x][g[x][0]]=y;
        g[y][0]++;
        g[y][g[y][0]]=x;
    }
    ek();
 long rez=0;
    for(i=1;i<=g[n][0];i++)
        rez+=f[g[n][i]][n];
        fout<<rez;
}