Pagini recente » Borderou de evaluare (job #2701328) | Borderou de evaluare (job #361737) | Borderou de evaluare (job #2023986) | Cod sursa (job #1441802) | Cod sursa (job #3190086)
#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;
}