Pagini recente » Cod sursa (job #832462) | Cod sursa (job #535176) | Cod sursa (job #923800) | Cod sursa (job #709632) | Cod sursa (job #188240)
Cod sursa(job #188240)
using namespace std;
#include <cstdio>
#include <string>
#include <queue>
#define N 256
#define oo 0x3f3f3f3f
int cap[N][N], cost[N][N];
int n;
int source, sink;
inline int bellman()
{
queue<int>Q;
int d[N],i,t[N];
bool inq[N];
memset(t, 0, sizeof(t));
memset(d, oo, sizeof(d));
memset(inq, 0,sizeof(inq));
inq[source]=1;
d[source]=1;
Q.push(source);
int u;
while(!Q.empty())
{
u=Q.front();
Q.pop();
inq[u]=0;
for(i=source;i<=sink;++i)
if(cap[u][i])
if(d[u]+cost[u][i]<d[i])
{
d[i]=d[u]+cost[u][i];
if(!inq[i]) {Q.push(i),inq[i]=1;}
t[i]=u;
}
}
if(t[sink]==0) return 0;
for(i=sink; i!=source;i=t[i])
cap[t[i]][i]=0,
cap[i][t[i]]=1;
return 1;
}
void flux()
{
while(bellman());
int sol=0,i,j;
for(i=1;i<=n;++i)
for(j=n+1;j<sink;++j)
if(!cap[i][j]) sol+=cost[i][j];
freopen("cc.out","w",stdout);
printf("%d\n", sol);
}
int main()
{
freopen("cc.in","r",stdin);
scanf("%d\n", &n);
source=0;
sink=2*n+1;
int v;
int i, j;
for(i=1;i<=n;++i)
for(j=n+1;j<sink;++j)
{
scanf("%d ", &v);
cap[i][j]=1;
cost[i][j]=v;
cost[j][i]=-v;
}
for(i=1;i<=n;++i)
{
cap[source][i]=1;
cost[source][i]=0;
}
for(i=n+1;i<sink;++i)
{
cap[i][sink]=1;
cost[i][sink]=0;
}
flux();
return 0;
}