Cod sursa(job #1804123)

Utilizator Zydrax04Morar Rares Zydrax04 Data 12 noiembrie 2016 11:30:39
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin ("maxflow.in");
ofstream fout ("maxflow.out");

struct vecini
{
    int e1, cap;
};

int n, m, h[1010], viz[1010];
vector <vecini> L[1010];
queue <int> q;

void citire()
{
    fin >> n >> m;
    int x, y, z;
    for(int i=1;i<=n;i++)
    {
        fin >> x >> y >> z;
        L[x].push_back({y,z});
    }
}

void transfer(int nod)
{
    if(nod==1)
    {
        for(unsigned int i=0;i<L[nod].size();i++)
        {
            h[L[nod][i].e1]=L[nod][i].cap;
        }
        return;
    }
    if(nod==n)
        return;
    for(unsigned int i=0;i<L[nod].size();i++)
        {
            int vecin=L[nod][i].e1;
            int flux=L[nod][i].cap;
            if(h[nod]+flux>h[vecin])
            {
                if(h[nod]>flux)
                {
                    h[vecin]+=flux;
                    h[nod]-=flux;
                }
                if(h[nod]<flux && h[nod]!=0)
                {
                    h[vecin]+=h[nod];
                    h[nod]=0;
                }
            }
        }
}

void BFS(int nod)
{
    h[nod]=0;
    viz[nod]=1;
    q.push(nod);
    while(!q.empty())
    {
        nod=q.front();
        transfer(nod);
        q.pop();
        for(unsigned int j=0;j<L[nod].size();j++)
        {
            int v=L[nod][j].e1;
            if(viz[v]==0)
            {
                q.push(v);
            }
        }
    }
}

int main()
{
    citire();
    BFS(1);
    fout << h[n];
    return 0;
}