Pagini recente » Cod sursa (job #2548530) | Istoria paginii runda/quarantine_training_2 | Cod sursa (job #957134) | Cod sursa (job #754459) | Cod sursa (job #1804560)
#include <fstream>
#include <queue>
using namespace std;
class InputReader {
public:
InputReader() {}
InputReader(const char *file_name) {
input_file = fopen(file_name, "r");
cursor = 0;
fread(buffer, SIZE, 1, input_file);
}
inline InputReader &operator >>(int &n) {
while(buffer[cursor] < '0' || buffer[cursor] > '9') {
advance();
}
n = 0;
while('0' <= buffer[cursor] && buffer[cursor] <= '9') {
n = n * 10 + buffer[cursor] - '0';
advance();
}
return *this;
}
private:
FILE *input_file;
static const int SIZE = 1 << 17;
int cursor;
char buffer[SIZE];
inline void advance() {
++ cursor;
if(cursor == SIZE) {
cursor = 0;
fread(buffer, SIZE, 1, input_file);
}
}
};
const int NMAX = 105;
const int INF = 1e9 + 15;
int n, s, t;
int cap[2 * NMAX][2 * NMAX];
int cost[2 * NMAX][2 * NMAX];
int dist[2 * NMAX];
int father[2 * NMAX];
queue <int> coada;
bool in_queue[2 * NMAX];
bool bellman() {
for (int i = 1; i <= 2 * n + 2; ++ i)
dist[i] = INF;
dist[s] = 0;
coada.push(s);
in_queue[s] = true;
int y;
while (!coada.empty()) {
y = coada.front();
in_queue[y] = false;
coada.pop();
for (int i = 1; i <= 2 * n + 2; ++ i)
if (cap[y][i] && dist[y] + cost[y][i] < dist[i]) {
dist[i] = dist[y] + cost[y][i];
father[i] = y;
if (!in_queue[i]) {
in_queue[i] = true;
coada.push(i);
}
}
}
return dist[t] != INF;
}
int fmcm() {
int ans = 0;
while (bellman()) {
int minim = INF;
int node = t;
while (father[node]) {
minim = min(minim, cap[father[node]][node]);
node = father[node];
}
node = t;
while (father[node]) {
cap[father[node]][node] -= minim;
cap[node][father[node]] += minim;
ans += minim * cost[father[node]][node];
node = father[node];
}
}
return ans;
}
int main()
{
InputReader cin("cc.in");
ofstream cout("cc.out");
cin >> n;
for (int i = 1; i <= n; ++ i)
for (int j = 1; j <= n;++ j) {
cap[i][n + j] = 1;
cin >> cost[i][n + j];
cost[n + j][i] = -cost[i][n + j];
}
s = 2 * n + 1;
t = 2 * n + 2;
for (int i = 1; i <= n; ++ i) {
cap[s][i] = 1;
cap[n + i][t] = 1;
}
cout << fmcm() << '\n';
//cin.close();
cout.close();
return 0;
}