Cod sursa(job #2818398)

Utilizator Vlad_AnicaAnica-Popa Vlad-Ioan Vlad_Anica Data 15 decembrie 2021 23:54:29
Problema Flux maxim Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.09 kb
#include <iostream>
#include <stdio.h>
#include <vector>

using namespace std;
const int NMAX = 1000, MMAX = 5000, INF = 1e8;

int myq[NMAX];
int flow[NMAX + 1][NMAX + 1], cap[NMAX + 1][NMAX + 1], father[NMAX + 1];
bool vis[NMAX + 1];
vector<int> edges[NMAX + 1];

bool bfs(int n);

int main()
{
    int i, n, v1, v2, c, m, len, node, maxflow, minflow;
    FILE *fin = fopen("maxflow.in", "r");

    fscanf(fin, "%d%d", &n, &m);
    for (i = 0; i < m; i++)
    {
        fscanf(fin, "%d%d%d", &v1, &v2, &c);
        cap[v1][v2] = c;
        edges[v1].push_back(v2);
        edges[v2].push_back(v1);
    }
    fclose(fin);

    maxflow = 0;
    while (bfs(n))
    {
        len = edges[n].size();
        for (i = 0; i < len; i++)
        {
            node = edges[n][i];
            father[n] = node;
            minflow = INF;
            while (node != 1)
            {
                minflow = min(minflow, cap[father[node]][node] - flow[father[node]][node]);
                node = father[node];
            }
            if (minflow)
            {
                node = n;
                while (node != 1)
                {
                    flow[father[node]][node] += minflow;
                    flow[node][father[node]] -= minflow;
                    node = father[node];
                }
                maxflow += minflow;
            }
        }
    }
    FILE *fout = fopen("maxflow.out", "w");
    fprintf(fout, "%d", maxflow);
    fclose(fout);
    return 0;
}

bool bfs(int n)
{
    int left, right, i, son, node, len;

    for (i = 1; i <= n; i++)
        vis[i] = 0;
    left = 0, right = 1, myq[0] = 1, vis[1] = 1;
    while (left < right)
    {
        node = myq[left++];
        len = edges[node].size();
        for (i = 0; i < len; i++)
        {
            son = edges[node][i];
            if (!vis[son] && cap[node][son] - flow[node][son] != 0)
            {
                vis[son] = 1;
                father[son] = node;
                myq[right++] = son;
            }
        }
    }
    return vis[n];
}