Pagini recente » Cod sursa (job #1191440) | Cod sursa (job #2080909)
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
const int MAXN = 1e2;
const int INF = 0x3f3f3f3f;
std::vector <int> g[2 * MAXN + 2];
int flow[2 * MAXN + 2][2 * MAXN + 2], cap[2 * MAXN + 2][2 * MAXN + 2], fath[2 * MAXN + 2],
cost[2 * MAXN + 2][2 * MAXN + 2], dist[2 * MAXN + 2];
bool inq[2 * MAXN + 2];
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;
}