Pagini recente » Cod sursa (job #3153835) | Cod sursa (job #123) | Cod sursa (job #3216701) | Cod sursa (job #3289420) | Cod sursa (job #2875550)
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
ifstream fin ("paznici2.in");
ofstream fout ("paznici2.out");
int n, m, S, D;
int x, y, z, C, cost[352][352], c[352][352];
vector<int>G[352];
int in[352], dist2[352], d[352], distTrue[352], p[352], flux, ans;
struct cmp {
bool operator() (int x, int y) {
return d[x] > d[y];
}
};
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
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;
}