Pagini recente » Cod sursa (job #1986548) | Cod sursa (job #200281) | Cod sursa (job #2083306) | Cod sursa (job #1591921) | Cod sursa (job #2415538)
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("cc.in");
ofstream g("cc.out");
#define nmax 105
#define INF 0x3f3f3f3f
int n, x, cap[nmax*2][nmax*2], cost[nmax*2][nmax*2], sursa, dest, t[nmax*2], sol = 0;
void init() {
sursa = 0, dest = 2*n+1;
for (int i = 1; i <= n; ++i) cap[sursa][i] = 1, cost[sursa][i] = cost[i][sursa] = 0;
for (int i = n+1; i < dest; ++i) cap[i][dest] = 1, cost[i][dest] = cost[dest][i] = 0;
}
void bellman() {
int d[2*nmax], ok = 1;
memset(d,INF,sizeof(d));
memset(t,0,sizeof(t));
d[sursa] = 0;
while (ok) {
ok = 0;
for (int i = sursa; i <= dest; ++i)
if (d[i] != INF) for (int j = sursa; j <= dest; ++j)
if (cap[i][j]) if (d[i] + cost[i][j] < d[j]) d[j] = d[i] + cost[i][j], t[j] = i, ok = 1;
}
sol += d[dest];
}
void umple() {
for (int i = dest; i; i=t[i]) cap[t[i]][i] = 0, cap[i][t[i]] = 1;
}
bool gata() {
for (int i = n + 1; i < dest; ++i) if (cap[i][dest]) return 1;
return 0;
}
int main()
{
f >> n;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j) {
f >> x;
cap[i][j+n] = 1, cost[i][j+n] = x, cost[j+n][i] = -x;
}
init();
while (gata()) { bellman(); umple(); }
/*for (int i = 1; i <= n; ++i) {
for (int j = n + 1; j < dest; ++j)
if (!cap[i][j]) { sol += cost[i][j]; break;}
}*/
g << sol << '\n';
return 0;
}