Pagini recente » Cod sursa (job #1153548) | Cod sursa (job #1773424) | Cod sursa (job #1773396) | Cod sursa (job #1177484) | Cod sursa (job #78899)
Cod sursa(job #78899)
#include <stdio.h>
#include <memory.h>
#define NMAX 256
#define INFI 0x3f3f3f3f
int cost[NMAX][NMAX];
int cap[NMAX][NMAX];
int n;
int res;
int source, sink;
void read()
{
int i, j;
scanf("%d", &n);
for(i = 1; i <= n; ++i)
for(j = 1; j <= n; ++j)
{
scanf("%d", &cost[i][n+j]);
cost[n+j][i] = -cost[i][n+j];
++cap[i][n+j];
}
source = 0;
sink = 2*n+1;
for(i = 1; i <= n; ++i)
cap[source][i] = cap[i+n][sink] = 1;
}
int bf()
{
int q[256];
bool viz[NMAX];
int d[NMAX], t[NMAX];
int inc, sf;
int x, i;
memset(d, INFI, sizeof(d));
memset(viz, 0, sizeof(viz));
d[source] = 0;
inc = sf = 1;
q[1] = source;
t[source] = -1;
while(inc <= sf)
{
x = q[inc++];
viz[x]=0;
inc&=255;
for(i = 0; i <= sink; ++i)
if(cap[x][i])
if(d[x] + cost[x][i] < d[i])
{
d[i] = d[x] + cost[x][i];
t[i] = x;
if(!viz[i]){ sf&=255;q[++sf] = i;viz[i]=1;}
}
}
if(d[sink] == INFI)
return 0;
for(i = sink; i != source; i = t[i])
--cap[t[i]][i], ++cap[i][t[i]];
return 1;
}
void solve()
{
while(bf());
for(int i = 1; i <= n; ++i)
for(int j = n+1; j < sink; ++j)
if(!cap[i][j])
res += cost[i][j];
}
int main()
{
freopen("cc.in", "r", stdin);
freopen("cc.out", "w", stdout);
read();
solve();
printf("%d\n", res);
return 0;
}