Cod sursa(job #3190086)

Utilizator AndreeaHzmAndreea Huzum AndreeaHzm Data 6 ianuarie 2024 22:58:36
Problema Cc Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <fstream>
#include <iostream>
using namespace std;

ifstream fin("cc.in");
ofstream fout("cc.out");

int x, y, z, nodes, capacities[201][201], flows[201][201], aux[201], dist[201], prev[201], queue[201], front, rear, totalCost = 0;

int main()
{
    fin >> nodes;

    for (x = 1; x <= nodes; x++)
        for (y = 1; y <= nodes; y++)
        {
            fin >> z;
            capacities[x][nodes + y + 1] = z;
            capacities[nodes + y + 1][x] = -z;
            capacities[0][x] = capacities[x + nodes + 1][nodes + 1] = 1;
        }

    while (1)
    {
        for (x = 1; x <= 2 * nodes + 1; x++)
        {
            aux[x] = 0;
            dist[x] = 10001;
        }
        dist[0] = 0;
        front = 0;
        rear = 0;
        queue[rear++] = 0;

        while (front < rear)
        {
            int current = queue[front++];
            if (current && current <= nodes)
            {
                for (x = nodes + 1; x <= 2 * nodes + 1; x++)
                    if (flows[current][x] < capacities[current][x] && dist[x] > dist[current] + capacities[current][x])
                        queue[rear++] = x, aux[x] = current, dist[x] = dist[current] + capacities[current][x];
            }
            else
                for (x = 1; x <= nodes + 1; x++)
                    if (flows[current][x] < capacities[current][x] && dist[x] > dist[current] + capacities[current][x])
                        queue[rear++] = x, aux[x] = current, dist[x] = dist[current] + capacities[current][x];
        }

        if (!aux[nodes + 1])
            break;

        for (int l = nodes + 1; l != 0; l = aux[l])
        {
            flows[aux[l]][l]++;
            flows[l][aux[l]]--;
        }

        totalCost += dist[nodes + 1];
    }

    fout << totalCost;

    return 0;
}