Cod sursa(job #2875551)

Utilizator PetyAlexandru Peticaru Pety Data 21 martie 2022 20:50:58
Problema Paznici2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <bits/stdc++.h>
 
using namespace std;
 
ifstream fin ("paznici2.in");
ofstream fout ("paznici2.out");
 
int n, m, S, D;
int x, y, z, C, cost[420][420], c[420][420];
vector<int>G[420];
 
int in[420], dist2[420], d[420], distTrue[420], p[420], flux, ans;
 

 

bool bellman_ford (int S) {
  queue<int>q;
  for (int i = 1; i <= 2 * n + 2; i++)
    dist2[i] = 1000000000;
  dist2[S] = 0;
  q.push(S);
  in[S] = 1;
  while (!q.empty()) {
    int u = q.front();
    in[u] = 0;
    q.pop();
    for (auto it: G[u]) {
      if (c[u][it]) {
        if (dist2[u] + cost[u][it] < dist2[it]) {
          dist2[it] = dist2[u] + cost[u][it];
					p[it] = u;
          if (!in[it]) {
            in[it] = 1;
            q.push(it);
          }
        }
      }
    }
  }
	return (dist2[D] != 1000000000);
}
 
int main()
{
  fin >> n;
	S = 1; D = 2 * (n + 1);
  for (int i = 1; i  <= n; i++)
	  for (int j = 1; j <= n; j++) {
			fin >> x;
			G[i + 1].push_back(j + n + 1);
			G[j + n + 1].push_back(i + 1);
			c[i + 1][j + n + 1] = 1;
			cost[i + 1][j + n + 1] = x;
			cost[j + n + 1][i + 1] = -x;
		}
	for (int i = 1; i <= n; i++) {
	  c[S][i + 1] = 1;
		G[S].push_back(i + 1);
		G[i + 1].push_back(S);

	}
	for (int i = 1; i <= n; i++) {
	  c[i + n + 1][D] = 1;
		G[D].push_back(i + n + 1);
		G[i + n + 1].push_back(D);
	}
  while (bellman_ford(S)) {
    int fmin = 1000000000;
    int cst = 0;
    for (int nod = D; nod != S; nod = p[nod]) {
      fmin = min (fmin, c[p[nod]][nod]);
      cst += cost[p[nod]][nod];
    }
    flux += fmin;
    ans += fmin * dist2[D];
    for (int nod = D; nod != S; nod = p[nod]) {
      c[p[nod]][nod] -= fmin;
      c[nod][p[nod]] += fmin;
    }
  }
  fout << ans << "\n";
	for (int i = n + 2; i <= 2 * n + 1; i++) {
		vector<int>s;
		bellman_ford(i);
		for (int j = 2; j <= n + 1; j++) {
			if (dist2[j] == cost[i][j])
			  s.push_back(j - 1);
		} 
		fout << s.size()<< " ";
		for (auto it : s)
		  fout << it << " ";
		fout << "\n";
	}
  return 0;
}