Cod sursa(job #2623085)

Utilizator PetyAlexandru Peticaru Pety Data 2 iunie 2020 16:32:41
Problema Cuplaj maxim de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.89 kb
#include <bits/stdc++.h>

using namespace std;

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

int cost[602][602], f[602][602], c[602][602], x, y, z, d[602], ind[602][602], viz[602], p[602];
int n, m, e;
vector<int>G[602];

bool BellmanFord () {
  for (int i = 0; i <= n + m + 1; i++)
    d[i] = 1e9;
  d[0] = 0;
  memset(viz, 0, sizeof(viz));
  queue<int>q;
  q.push(0);
  viz[0] = 1;
  memset(p, -1, sizeof(p));
  while (!q.empty()) {
    int x = q.front();
    q.pop();
    for (auto it : G[x]) {
      if (f[x][it] < c[x][it] && d[it] > d[x] + cost[x][it]) {
        d[it] = d[x] + cost[x][it];
        p[it] = x;
        if (!viz[it]) {
          viz[it] = 1;
          q.push(it);
        }
      }
    }
    viz[x] = 0;
  }
  return (d[n + m + 1] != 1e9);
}


int main()
{
  fin >> n >> m >> e;
  for (int i = 1; i <= e; i++) {
    fin >> x >> y >> z;
    y += n;
    c[x][y] = 1;
    cost[x][y] = z;
    cost[y][x] = -z;
    G[x].push_back(y);
    G[y].push_back(x);
    ind[x][y] = i;
  }
  for (int i = 1; i <= n; i++) {
    c[0][i] = 1;
    G[0].push_back(i);
    G[i].push_back(0);
  }

  for (int i = 1; i <= m; i++) {
    c[i + n][n + m + 1] = 1;
    G[i + n].push_back(n + m + 1);
    G[m + n + 1].push_back(n + i);
  }
  vector<int>ans;
  int flow = 0, cost = 0;
  while (BellmanFord()) {
    int fmin = 1e9;
    for (int i = n + m + 1; i != 0; i = p[i]) {
      fmin = min(fmin, c[p[i]][i] - f[p[i]][i]);
    }
    if (fmin != 0)
      for (int i = n + m + 1; i != 0; i = p[i]) {
        f[p[i]][i] += fmin;
        f[i][p[i]] -= fmin;
      }
    cost += fmin * d[n + m + 1];
  }
  for (int i = 1; i <= n; i++)
    for (int j = n + 1; j <= n + m; j++)
      if (f[i][j] && c[i][j])
        ans.push_back(ind[i][j]);
  fout << ans.size() << " " << cost << "\n";
  for (auto it : ans)
    fout << it << " ";
  return 0;
}