Cod sursa(job #1885679)

Utilizator alex99Chelba Alexandru alex99 Data 20 februarie 2017 10:59:03
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
ifstream f1("maxflow.in");
ofstream g("maxflow.out");
int n,m,viz[1001],s,d;
int f[1001][1001],c[1001][1001];
int q[1001];
int bfs()
{
    int p,u,i,x;
    q[0]=s;
    p=u=0;
    viz[s]=1;
    while(p<=u&&!viz[d])
    {
        x=q[p++];
        for(int i=1;i<=n;i++)
        if(!viz[i])
            if(f[x][i]<c[x][i]) {viz[i]=x; q[++u]=i;}
            else
            if(f[i][x]>0) {viz[i]=-x; q[++u]=i;}
    }
    return !viz[d];
}
void damfluxlapompa()
{
    int i,a,b,lg,v;
    int l[101];
    do
    {
        memset(viz,0,sizeof(viz));
        if(bfs()) return ;
        l[0]=d;lg=0;
        a=b=INF;
        while(l[lg]!=s)
        {
            ++lg;
            l[lg]=abs(viz[l[lg-1]]);
            if(viz[l[lg-1]]>0) a=min(a,c[l[lg]][l[lg-1]]-f[l[lg]][l[lg-1]]);
            else
            if(viz[l[lg-1]]<0) b=min(b,f[l[lg-1]][l[lg]]);
        }
        v=min(a,b);
        for(int i=lg;i>0;i--)
        if(viz[l[i-1]]>0)
            f[l[i]][l[i-1]]+=v;
        else
            f[l[i-1]][l[i]]-=v;
    }while(1);
}
int main()
{
    f1>>n>>m>>s>>d;
    for(int i=1;i<=m;i++)
    {
        int x,y,flux;
        f1>>x>>y>>flux;
        c[x][y]=flux;
    }
    damfluxlapompa();
    /**
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
            g<<i<<" "<<j<<" "<<f[i][j]<<'\n';
    }
    **/
    int sum=0;
    for(int i=1;i<=n;i++)
        sum+=f[i][d];
    g<<sum<<'\n';
    return 0;
}