Pagini recente » Cod sursa (job #728302) | Cod sursa (job #535992) | Cod sursa (job #427988) | Cod sursa (job #1371762) | Cod sursa (job #1155282)
#include <fstream>
#include <queue>
using namespace std;
typedef pair <int, int> data;
#define oo 0x3f3f3f3f
#define min(a,b) ((a < b) ? a : b)
ifstream fin ("cc.in");
ofstream fout ("cc.out");
vector <vector <int> > cost, c;
vector <int> dist, t;
queue <int> Q;
vector <bool> q;
int n, s, d, sol;
bool bellmanford() {
dist.assign (2*(n+1), oo);
q.assign (2*(n+1), 0);
dist[s] = 0;
Q.push(s);
q[s] = 1;
while (Q.size()) {
int x = Q.front();
Q.pop();
for (int i = 1; i <= d; ++i)
if (c[x][i] && dist[x] + cost[x][i] < dist[i]) {
dist[i] = dist[x] + cost[x][i];
t[i] = x;
Q.push(i);
}
}
return (dist[d] != oo);
}
void Resizeall(int x) {
c.resize(x);
cost.resize(x);
dist.resize(x);
t.resize(x);
q.resize(x);
for (int i = 0; i < x; ++i)
c[i].resize(x), cost[i].resize(x);
}
int main() {
fin >> n;
Resizeall(2*(n+1));
s = 0;
d = 2 * n + 1;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j) {
int x;
fin >> x;
c[i][n+j] = 1;
cost[i][n+j] = x;
cost[n+j][i] = -x;
}
for (int i = 1; i <= n; ++i)
c[s][i] = c[n+i][d] = 1;
while (bellmanford()) {
for (int x = d; x != s; x = t[x])
--c[t[x]][x], c[x][t[x]]++;
sol += dist[d];
}
fout << sol;
fout.close();
}