Cod sursa(job #2202095)

Utilizator Marius7122FMI Ciltea Marian Marius7122 Data 7 mai 2018 15:37:11
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.16 kb
#include <iostream>
#include <vector>
#include <fstream>
#include <queue>

const int N = 1005;

using namespace std;

vector<int> g[N];
int flux[N][N], capacitate[N][N];
int n,m,i,j;
int tata[N];

int bf(int s)
{
    int i;
    for(i=1;i<=n;i++)
        tata[i] = 0;

    queue<int> q;
    q.push(s);

    while(!q.empty())
    {
        int x = q.front();
        q.pop();

        int a,b;
        for(int y : g[x])
        {
            a = x;
            b = y;
            if(b < 0)
            {
                b = -b;
                swap(a,b);
            }

            if(!tata[b] && capacitate[a][b] > flux[a][b])
            {
                q.push(b);
                if(y > 0)
                    tata[b] = a;
                else
                    tata[b] = -a;

                if(b == n)
                    return 1;
            }
        }
    }

    return 0;
}

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

    fin>>n>>m;
    for(i=0;i<m;i++)
    {
        int a,b,c;
        fin>>a>>b>>c;


        g[a].push_back(b);
        g[b].push_back(-a);
        capacitate[a][b] = c;
    }



    long long fluxTotal = 0;
    while(bf(1))
    {
        int mf = 1<<30;
        int t = n;


        int cap, fl;
        while(tata[t])
        {
            if(tata[t] < 0)
            {
                tata[t] = -tata[t];
                if(capacitate[t][tata[t]] - flux[t][tata[t]] < mf)
                    mf = capacitate[t][tata[t]] - flux[t][tata[t]];
            }

            else
            {
                if(capacitate[tata[t]][t] - flux[tata[t]][t] < mf)
                    mf = capacitate[tata[t]][t] - flux[tata[t]][t];
            }

            t = tata[t];
        }

        fluxTotal += mf;

        t = n;
        while(tata[t])
        {
            if(tata[t] > 0)
                flux[tata[t]][t] += mf;

            else
            {
                tata[t] = -tata[t];
                flux[t][tata[t]] -= mf;
            }

            t = tata[t];
        }
    }

    fout<<fluxTotal;

    return 0;
}