Cod sursa(job #2674493)

Utilizator Iulia14iulia slanina Iulia14 Data 19 noiembrie 2020 12:45:30
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream cin ("maxflow.in");
ofstream cout ("maxflow.out");
vector <int> lista[1005];
int cap[1005][1005];
int flux[1005][1005];
void adaug(int x, int y, int c)
{
    lista[x].push_back(y);
    lista[y].push_back(x);
    cap[x][y] = c;
}
int viz[1005];
queue <int> q;
int prv[1005], n;
int bfs(int s, int d)
{
    int i;
    for (i = 1; i <= n; i++)
        viz[i] = prv[i] = 0;
    viz[s] = 1;
    q.push(s);
    while (!q.empty())
    {
        int x = q.front();
        q.pop();
        for (int i = 0; i < lista[x].size(); i++)
        {
            int y = lista[x][i];
            if (!viz[y] && flux[x][y] < cap[x][y])
            {
                prv[y] = x;
                q.push(y);
                viz[y] = 1;
            }
        }
    }
    if (prv[d])
        return 1;
    return 0;
}
int main()
{
    int m, i;
    cin >> n;
    cin >> m;
    for (i = 1; i <= m; i++)
    {
        int x, y, c;
        cin >> x >> y >> c;
        adaug(x, y, c);
    }
    int flow = 0;
    int s = 1, d = n;
    while (bfs(s, d))
    {
int        mini = 2e9;
        for (i = d; i != s; i = prv[i])
            mini = min(mini, cap[prv[i]][i] - flux[prv[i]][i]);
        for (i = d; i != s; i = prv[i])
        {
            flux[prv[i]][i] += mini;
            flux[i][prv[i]] -= mini;
        }
        flow += mini;
    }
    cout << flow;
    return 0;
}