Cod sursa(job #2080905)

Utilizator DruffbaumPopescu Vlad Druffbaum Data 3 decembrie 2017 17:20:46
Problema Cc Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>

const int MAXN = 1e2;
const int INF = 0x3f3f3f3f;

std::vector <int> g[2 * MAXN + 1];
int flow[2 * MAXN + 1][2 * MAXN + 1], cap[2 * MAXN + 1][2 * MAXN + 1], fath[2 * MAXN + 1],
    cost[2 * MAXN + 1][2 * MAXN + 1], dist[2 * MAXN + 1];
bool inq[2 * MAXN + 1];
std::queue <int> q;

static inline int min(int a, int b) {
  return a > b ? b : a;
}

bool bellman(int s, int d) {
  int u;
  memset(dist, INF, sizeof(dist));
  dist[s] = 0;
  q.push(s);
  while (!q.empty()) {
    u = q.front();
    q.pop();
    inq[u] = 0;
    for (auto v: g[u]) {
      if (flow[u][v] < cap[u][v] && dist[v] > dist[u] + cost[u][v]) {
        dist[v] = dist[u] + cost[u][v];
        fath[v] = u;
        if (!inq[v]) {
          inq[v] = 1;
          q.push(v);
        }
      }
    }
  }
  return (dist[d] < INF);
}

int main() {
  int n, c, u, fl, mincost;
  FILE *f = fopen("cc.in", "r");
  fscanf(f, "%d", &n);
  for (u = 1; u <= n; ++u) {
    for (int v = 1; v <= n; ++v) {
      fscanf(f, "%d", &c);
      g[u].push_back(v + n);
      g[v + n].push_back(u);
      cost[u][v + n] = c;
      cost[v + n][u] =-c;
      cap[u][v + n] = 1;
    }
  }
  fclose(f);
  u = 0;
  for (int v = 1; v <= n; ++v) {
    g[u].push_back(v);
    g[v].push_back(u);
    cap[u][v] = 1;
  }
  u = 2 * n + 1;
  for (int v = n + 1; v <= 2 * n; ++v) {
    g[u].push_back(v);
    g[v].push_back(u);
    cap[v][u] = 1;
  }
  mincost = 0;
  while (bellman(0, 2 * n + 1)) {
    fl = INF;
    u = 2 * n + 1;
    while (u > 0) {
      fl = min(fl, cap[fath[u]][u] - flow[fath[u]][u]);
      u = fath[u];
    }
    u = 2 * n + 1;
    while (u > 0) {
      flow[fath[u]][u] += fl;
      flow[u][fath[u]] -= fl;
      u = fath[u];
    }
    mincost += fl * dist[2 * n + 1];
  }
  f = fopen("cc.out", "w");
  fprintf(f, "%d\n", mincost);
  fclose(f);
  return 0;
}