Pagini recente » Cod sursa (job #481630) | Cod sursa (job #2632176) | Cod sursa (job #745048) | Cod sursa (job #680031) | Cod sursa (job #902849)
Cod sursa(job #902849)
#include <fstream>
#define E 100001
#define N 202
using namespace std;
ifstream fin("cc.in"); ofstream fout("cc.out");
long e=0;
int k, i, j, n, v[N][N], c[N][N], f[N][N], w[E], u[N], g[N], p, q, t, l;
int main()
{
fin >> n;
for(i = 1; i <= n; i++)
for(j = 1; j <= n; j++)
{
fin >> k;
v[i][n + j + 1] = k, v[n + j + 1][i] = -k;
c[i][n + j + 1] = 1;
}
for(i = 1; i <= n; i++)
c[0][i] = c[i + n + 1][n + 1] = 1, v[0][i] = v[i + n + 1][n + 1] = 0;
while(1)
{
for(i = 1; i <= 2 * n + 1; i++)
u[i] = 0, g[i] = E;
g[0] = p = q =0, w[q++] = 0;
while(p < q)
{
t = w[p++];
if(t && t <=n)
{
for(i = n + 1; i <= 2 * n + 1; i++)
if(f[t][i] < c[t][i] && g[i] > g[t] + v[t][i])
w[q++] = i, u[i] = t, g[i] = g[t] + v[t][i];
}
else
for(i = 1; i <= n + 1; i++)
if(f[t][i] < c[t][i] && g[i] > g[t] + v[t][i])
w[q++] = i, u[i] = t, g[i] = g[t] + v[t][i];
}
if(!u[n + 1])
break;
for(l = n + 1; l; l = u[l])
f[u[l]][l]++, f[l][u[l]]--;
e += g[n+1];
}
fout << e;
fin.close(); fout.close();
return 0;
}