Cod sursa(job #3191048)

Utilizator BranckhiusIon Dragos-Constantin Branckhius Data 8 ianuarie 2024 18:35:54
Problema Cc Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.64 kb
#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;

int n, f[256][256], a[256][256], dist[256], pred[256];

// Funcție pentru implementarea algoritmului lui Bellman-Ford
int bellman() {
  memset(pred, -1, sizeof(pred));
  memset(dist, 0x3f3f, sizeof(dist));
  dist[0] = 0;
  pred[0] = 0;

  int i, j, ok = 1;

  while (ok == 1) {
    ok = 0;
    for (i = 0; i <= 2 * n + 1; ++i)
      for (j = 0; j <= 2 * n + 1; ++j)
        if (f[i][j] > 0 && dist[j] > dist[i] + a[i][j]) {
          dist[j] = dist[i] + a[i][j];
          pred[j] = i;
          ok = 1;
        }
  }

  if (pred[2 * n + 1] == -1) return 0;
  return 1;
}

// Funcție pentru calcularea fluxului maxim
void flux() {
  int i, j;
  for (i = 1; i <= n; ++i) f[0][i] = f[n + i][2 * n + 1] = 1;

  while (bellman() == 1) {
    int p = 2 * n + 1;
    while (p) {
      f[pred[p]][p]--;
      f[p][pred[p]]++;
      p = pred[p];
    }
  }

  int sum = 0;
  for (i = 1; i <= n; ++i)
    for (j = n + 1; j <= 2 * n; ++j)
      if (!f[i][j]) sum += a[i][j];

  // Scrie rezultatul în fișierul de ieșire
  ofstream g("cc.out");
  g << sum << endl;
  g.close();
}

int main() {
  // Deschide fișierul de intrare
  ifstream f("cc.in");

  // Citirea numărului de noduri
  f >> n;

  // Citirea capacităților muchiilor și inițializarea grafului
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= n; ++j) {
      f >> a[i][j + n];
      a[j + n][i] = -a[i][j + n];
      f[i][j + n] = 1;
    }

  f.close();

  // Rezolvarea problemei și scrierea rezultatului în fișierul de ieșire
  flux();

  return 0;
}