Cod sursa(job #2279460)

Utilizator XibronSomai Norbert-Attila Xibron Data 9 noiembrie 2018 16:39:14
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.26 kb
#include <iostream>
#include <fstream>
#include <climits>
#include <windows.h>

#define N 100


using namespace std;

int capacity[N][N]; // maximalis kapacitasok adott [i][j] ut kozott
int flow[N][N]; // aktualis folyam adott [i][j] kozott
int n; // csomopontok szama
int m; // elek szama

int t[N], L[N], k = 1;

void init()
{
    n = m = 0;
    for(int i = 0; i < N; ++i)
    {
        for(int j = 0; j < N; ++j)
        {
            capacity[i][j] = flow[i][j] = 0;
        }
    }
}

void beolvas()
{
    cin >> n >> m;
    int x, y, c;
    for(int i = 1; i <= m; ++i)
    {
        cin >> x >> y >> c; // x csomopontbol van ut y-ba, c kapacitassal
        capacity[x][y] = c;
    }
}

void kiirJelenlegiFolyam()
{
    for(int i = 1; i <= n; ++i)
    {
        for(int j = 1; j <= n; ++j)
        {
            cout << capacity[i][j] << " ";
        }
        cout << "\n";
    }
}

int utkeres(int csp)
{
    if(csp == n)
    {
        t[k] = csp;
        return 1;
    }
    t[k] = csp;
    for(int i = 1; i<=n; i++)
    {
        if((capacity[csp][i] != 0) && (L[i] == 0))
        {
            L[i] = 1;
            k++;
            int a = utkeres(i);
            if(!a)
                k--;
            else return a;
        }
    }
    return 0;
}

int minut()
{
    int mini = INT_MAX;
    for(int i = 2; i<=k; i++)
    {
        if(capacity[t[i-1]][t[i]] < mini)mini = capacity[t[i-1]][t[i]];
    }
    return mini;
}

void megold()
{
    while(utkeres(1))
    {
        int mini = minut();
        for(int i = 2; i<=k; i++)
        {
            capacity[t[i-1]][t[i]] = capacity[t[i-1]][t[i]] - mini;
            capacity[t[i]][t[i-1]] = capacity[t[i]][t[i-1]] + mini;
        }
        for(int i = 2; i<=n; i++)
            L[i] = 0;
        L[1] = 1;
        k = 1;
       // cout<<endl;
       // kiirJelenlegiFolyam();
    }
        int a = 0;
        for(int i = 1; i<=n; i++)
        {
            if(capacity[n][i] != 0)a += capacity[n][i];
        }
        cout<<a;

}


int main()
{
    freopen("maxflow.in", "rt", stdin);
    freopen("maxflow.out", "wt", stdout);
    init();
    beolvas();
    //kiirJelenlegiFolyam();
    L[1] = 1;
    megold();

    return 0;
}