Cod sursa(job #1994931)

Utilizator vladm98Munteanu Vlad vladm98 Data 26 iunie 2017 17:24:31
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin ("maxflow.in");
ofstream fout ("maxflow.out");
bool viz[1001];
int capacitate[1001][1001];
int flux[1001][1001];
int tata[1001];
int n, m;
vector <int> graf[1001];
deque <int> solutie;
bool maxflow (int sursa)
{
    viz[sursa] = 1;
    solutie.push_back(sursa);
    while (solutie.empty() == 0)
    {
        int nod = solutie.front();
        solutie.pop_front();
        if (nod == n)
            continue;
        for (auto x:graf[nod])
        {
            if (viz[x] == 0 && flux[nod][x]<capacitate[nod][x])
            {
                viz[x] = 1;
                solutie.push_back(x);
                tata[x] = nod;
            }
        }
    }
    return viz[n];
}
int main()
{
    int raspuns = 0;
    fin >> n >> m;
    for (int i = 1; i<=m; ++i)
    {
        int x, y, f;
        fin >> x >> y >> f;
        capacitate[x][y]+=f;
        graf[x].push_back(y);
        graf[y].push_back(x);
    }
    while (maxflow(1))
    {
        for (auto x:graf[n])
        {
            if (viz[x] && capacitate[x][n]>flux[x][n])
            {
                tata[n] = x;
                int copie = n;
                int minim = 1<<30;
                while (copie != 1)
                {
                    minim = min(minim, capacitate[tata[copie]][copie]-flux[tata[copie]][copie]);
                    copie = tata[copie];
                }
                copie = n;
                while (copie != 1)
                {
                    flux[tata[copie]][copie]+=minim;
                    flux[copie][tata[copie]]-=minim;
                    copie = tata[copie];
                }
                raspuns+=minim;
            }
        }
        memset(viz, 0, sizeof(viz));
        memset(tata, 0, sizeof(tata));
    }
    fout << raspuns;
    return 0;
}