Cod sursa(job #2347538)

Utilizator cc4infinityCojocaru Catalin cc4infinity Data 18 februarie 2019 21:04:24
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

int i,j,a,b,n,m,x,y,z;
struct lat
{
    int f;
    int c;
}g[1004][1004];

struct pct
{
    int h,ex;
}p[1004];

int exces()
{
    for (i=2;i<n;i++)
        if (p[i].ex) return i;
    return -1;
}

bool push(int u)
{
    for (i=1;i<=n;i++)
    if (g[u][i].c)
    {
        if (g[u][i].c==g[u][i].f) continue;
        if (p[u].h>p[i].h)
        {
            int flux=min(g[u][i].c-g[u][i].f,p[u].ex);
            p[i].ex+=flux;
            p[u].ex-=flux;
            g[u][i].f+=flux;
            g[i][u].c+=flux;
            return 1;
        }
    }
    return false;
}

void relable(int u)
{
    int m=100000000;
    for (i=1;i<=n;i++)
        if (g[u][i].c>g[u][i].f)
        if (p[i].h<m) m=p[i].h;
    p[u].h=m+1;
}

int main()
{
    fin>>n>>m;
    for (i=1;i<=m;i++)
    {
        fin>>x>>y>>z;
        g[x][y].c=z;
        if (x==1)
        {
            g[x][y].f=g[x][y].c;
            p[y].ex=g[x][y].f;
            g[y][x].c=g[x][y].c;
        }
    }
    p[1].h=n;
    int u=exces();
    while (u!=-1)
    {
        if (!push(u))
            relable(u);
        u=exces();
    }
    fout<<p[n].ex;
    return 0;
}


/*struct lat
{
    int fl,cp,a,b;
    lat(int fl,int cp,int a,int b)
    {
        this->fl=fl;
        this->cp=cp;
        this->a=a;
        this->b=b;
    }
};

struct pc
{
    int h;
    int ex;
    pc(int h,int ex)
    {
        this->ex=ex;
        this->h=h;
    }
};*/