Pagini recente » Cod sursa (job #1668539) | Cod sursa (job #1615433) | Cod sursa (job #835086) | Cod sursa (job #160358) | Cod sursa (job #134157)
Cod sursa(job #134157)
using namespace std;
#include <cstdio>
#include <string>
#include <queue>
#define maxn 402
#define oo 0x3f3f3f3f
int cost[maxn][maxn],c[maxn][maxn],C[maxn][maxn],d[maxn],t[maxn];
int source, sink;
int n;
int l[maxn], r[maxn];
bool use[maxn];
int S[201][201];
void read()
{
freopen("cc.in","r",stdin);
scanf("%d\n", &n);
int i, j, p;
source=0;
sink=2*n+1;
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
{
scanf("%d ", &p);
cost[i][j+n]=p;
cost[j+n][i]=-p;
c[i][j+n]=1;
C[i][j+n]=1;
}
for(i=1;i<=n;++i) cost[source][i]=0, c[source][i]=1, C[source][i]=1;
for(i=n+1;i<=(n<<1);++i) cost[i][sink]=0, c[i][sink]=1, C[i][sink]=1;
}
inline int bellman()
{
queue<int>Q;
int u, i;
memset(d, oo, sizeof(d));
memset(t, 0, sizeof(t));
d[source]=0;
Q.push(source);
while(!Q.empty())
{
u=Q.front();
Q.pop();
for(i=source;i<=sink;++i)
if(c[u][i])
if(d[u]+cost[u][i]<d[i])
{
d[i]=d[u]+cost[u][i];
Q.push(i);
t[i]=u;
}
}
if(d[sink]==oo) return 0;
for(i=sink; i!=source; i=t[i])
{
c[t[i]][i]=0;
c[i][t[i]]=1;
}
return 1;
}
int main()
{
read();
while(bellman());
int i, j,s=0;
for(i=1;i<=n;++i)
for(j=n+1;j<sink;++j)
if(!c[i][j]) s+=cost[i][j];
freopen("cc.out","w",stdout);
printf("%d\n",s);
return 0;
}