Cod sursa(job #476139)
#include <fstream>
#include <vector>
#include <queue>
#define Nmax 256
using namespace std;
int N, A, M;
int Cst[Nmax][Nmax], Cap[Nmax][Nmax], Flw[Nmax][Nmax], Dst[Nmax], Ftr[Nmax];
vector<int> Deg[Nmax];
queue<int> Q;
void read()
{
int i, j, c;
ifstream fin("cc.in");
fin >> N;
for (i = 1; i <= N; ++i)
{
for (j = 1; j <= N; ++j)
{
fin >> Cst[i][j + N];
}
}
fin.close();
}
bool flow()
{
int i, j, n, u, v;
vector<int>::iterator k;
for (i = 1, n = N << 1 | 1; i <= n; ++i)
{
Dst[i] = M;
}
Q.push(0);
while (!Q.empty())
{
u = Q.front();
for (k = Deg[u].begin(); k != Deg[u].end(); ++k)
{
v = *k;
if (Cap[u][v] > Flw[u][v] && Dst[v] > Dst[u] + Cst[u][v])
{
Dst[v] = Dst[u] + Cst[u][v];
Ftr[v] = u;
if (v != n)
{
Q.push(v);
}
}
}
Q.pop();
}
if (Dst[n] == M)
{
return false;
}
A += Dst[n];
for (u = Ftr[n], v = n; v; v = u, u = Ftr[u])
{
Flw[u][v] += i;
Flw[v][u] -= i;
}
return true;
}
void solve()
{
int i, j, n;
M = numeric_limits<int>::max();
for (i = 1; i <= N; ++i)
{
for (j = 1; j <= N; ++j)
{
Deg[i].push_back(j + N);
Deg[j + N].push_back(i);
Cap[i][j + N] = 1;
Cst[j + N][i] = -Cst[i][j + N];
}
}
for (i = 1, n = N << 1 | 1; i <= N; ++i)
{
Deg[0].push_back(i);
Deg[i].push_back(0);
Cap[0][i] = 1;
Deg[i + N].push_back(n);
Deg[n].push_back(i + N);
Cap[i + N][n] = 1;
}
while (flow());
}
void write()
{
ofstream fout("cc.out");
fout << A << '\n';
fout.close();
}
int main()
{
read();
solve();
write();
return 0;
}