Cod sursa(job #1414979)

Utilizator andreiblaj17Andrei Blaj andreiblaj17 Data 3 aprilie 2015 13:55:19
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 kb
#include <iostream>
#include <fstream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>
#define nmax 1001
#define inf 1<<30

using namespace std;

int n, m, fm;
vector <int> G[nmax];
bool viz[nmax];
int C[nmax][nmax], F[nmax][nmax], tata[nmax];
queue <int> q;

bool bfs()
{
    //verific daca este drum de flux nenul de la S la D
    memset(viz, false, sizeof(viz));
    viz[1] = true;
    q.push(1);
    while (!q.empty())
    {
        int nod = q.front();
        q.pop();
        if (nod == n)
            continue;
        for (int i = 0; i < G[nod].size(); i++)
        {
            int vecin = G[nod][i];
            if (viz[vecin] == true || C[nod][vecin] == F[nod][vecin])
                continue;
            tata[vecin] = nod;
            viz[vecin] = true;
            q.push(vecin);
        }
    }
    return viz[n];
}

int main()
{

    ifstream fi("maxflow.in");
    ofstream fo("maxflow.out");

    fi >> n >> m;
    for (int i = 1; i <= m; i++)
    {
        int x, y, c;
        fi >> x >> y >> c;
        G[x].push_back(y);
        G[y].push_back(x);
        C[x][y] = c;
    }

    while (bfs())
    {
        for (int i = 0; i < G[n].size(); i++)
        {
            int vecin = G[n][i];

            if (!viz[vecin] || C[vecin][n] == F[vecin][n])
                continue;

            tata[n] = vecin;

            int fMin = inf;

            for (int nod = n; nod != 1; nod = tata[nod])
                fMin = min(fMin, C[tata[nod]][nod] - F[tata[nod]][nod]);

            if (fMin == 0)
                continue;

            fm += fMin;

            for (int nod = n; nod != 1; nod = tata[nod])
            {
                F[nod][tata[nod]] -= fMin;
                F[tata[nod]][nod] += fMin;
            }

        }
    }

    fo << fm << "\n";

    fi.close();
    fo.close();

    return 0;
}