Pagini recente » Cod sursa (job #2821415) | Cod sursa (job #2218283) | Cod sursa (job #2257280) | Cod sursa (job #2381928) | Cod sursa (job #78908)
Cod sursa(job #78908)
using namespace std;
#include <stdio.h>
#include <memory.h>
#include <queue>
#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()
{
queue<int>q;
//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.push(source);
t[source] = -1;
while(!q.empty())
{
x = q.front();
q.pop();
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;
q.push(i);
}
}
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;
}