Cod sursa(job #2970328)

Utilizator flavigFlavian flavig Data 24 ianuarie 2023 21:45:07
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.17 kb
#include <iostream>
#include <vector>
#include <queue>
#include <fstream>
#include <cmath>
#include <climits>

using namespace std;

int n,m;
int tata[1001], viz[1001];
int capacitate [1001][1001];
int flux[1001][1001];

int construire_lant()
{
    int i,j,u,v,w,flx;
    
    for(i=1; i<=n; i++)
    {
        tata[i]=0;
        viz[i]=0;
    }

    queue<int> q;

    q.push(1);
    viz[1]=1;

    while(!q.empty())
    {
        u=q.front();
        q.pop();
        
        for(i=1;i<=n;i++) //arcele directe
        {
            v=i;
            w=capacitate[u][v]; //capacitatea
            flx=flux[u][v]; //fluxul trimis
            if(viz[v]==0 && w-flx>0)
            {
                q.push(v);
                viz[v]=1;
                tata[v]=u;
                if(v==n)
                    return 1;
            }
        }

        for(i=1;i<=n;i++)
        {    
            v=i;
            flx=flux[v][u];
            if(viz[v]==0 && flx>0)
            {
                q.push(v);
                viz[v]=1;
                tata[v]=-u;
                if(v==n)
                    return 1;
            }
        }
                    
    }
    return 0;
}

void revizuieste_lant()
{
    int i,x,t,w,min_f=INT_MAX;
    x=n;
    while(x!=1)
    {
        t=tata[x];
        if(t>0)
        {    
            w=capacitate[t][x] - flux[t][x];
        }
        else
            {
            t=abs(t);
            w=flux[x][t];
            }
        min_f=min(min_f,w);
        x=t;
    }
    x=n;
    while(x!=1)
    {
        t=tata[x];
        if(t>0)
            flux[t][x]+=min_f;
        else
            {
            t=abs(t);
            flux[x][t]-=min_f;
            }
        x=t;
    }
}


int main()
{
    ifstream f("maxflow.in");
    ofstream g("maxflow.out");

    int x, y, c, i, j;

    f >> n >> m;
    for (i = 1; i <= m; i++)
    {
        f >> x >> y >> c;
        capacitate[x][y]=c;
    }

    while(construire_lant()==1)
        revizuieste_lant();
    
    int s=0;
    for(i=2;i<=n;i++)
        s+=capacitate[1][i];

    g<<s<<endl;
    return 0;
}