Cod sursa(job #1818595)

Utilizator bleo16783FMI Bleotiu Cristian bleo16783 Data 29 noiembrie 2016 14:24:15
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <iostream>
#include<fstream>
#include<vector>
#include<cstring>
using namespace std;
#define NMAX 1024
#define pb push_back
int n,m,i,j,k,x,y,z,flow,fm;
vector<int>a[NMAX];
int t[NMAX],F[NMAX][NMAX],c[NMAX][NMAX],q[NMAX],b[NMAX],d[NMAX];
int BF()
{
    int i,j;
    q[0]=2;//q[0]=lungimea cozii+1 si q[i]=elementul de pe pozitia i din coada
    q[1]=1;
    memset(b,0,sizeof(b));
    b[1]=1;
    for(i=1;i<q[0];++i)
    {
        x=q[i];
        if(x==n)continue;
        for(j=0;j<d[x];++j)
        {
            y=a[x][j];
            if(F[x][y]==c[x][y]||b[y])continue;
            b[y]=1;
            t[y]=x;
            q[q[0]++]=y;
        }
    }
    return b[n];
}
int main()
{
    ifstream f("maxflow.in");
    f>>n>>m;
    while(m--)
    {
        f>>x>>y>>z;
        c[x][y]=z;
        a[x].pb(y);
        a[y].pb(x);
        ++d[x];++d[y];
    }
    for(flow=0;BF();)
    {
        for(i=0;i<d[n];++i)
        {
            x=a[n][i];
            if(c[x][n]==F[x][n]||!b[x])
                continue;
            fm=1e8;
            t[n]=x;
            for(x=n;x!=1;x=t[x])
            {
                fm=min(fm,c[t[x]][x]-F[t[x]][x]);
            }
            if(fm==0)continue;
            for(x=n;x!=1;x=t[x])
            {
                F[t[x]][x]+=fm;
                F[x][t[x]]-=fm;
            }
            flow+=fm;
        }
    }
    ofstream g("maxflow.out");
    g<<flow;
    g.close();
    return 0;
}