Pagini recente » Cod sursa (job #1514020) | Cod sursa (job #338077) | Cod sursa (job #813845) | Cod sursa (job #1549920) | Cod sursa (job #292035)
Cod sursa(job #292035)
#include <stdio.h>
#include <vector>
using namespace std;
#define maxn 205
#define inf 1000000000
#define nume "cc"
FILE *in=fopen(nume".in","r"),*out=fopen(nume".out","w");
int n,m,source,dest;
int drum,l;
int g[maxn],dist[maxn],from[maxn];
int q[maxn],u[maxn];
int c[maxn][maxn],f[maxn][maxn],cost[maxn][maxn],a[maxn][maxn];
void citire(){
int i,j,z;
fscanf(in,"%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){
fscanf(in,"%d",&z);
cost[i][n+j]=z;
cost[n+j][i]=-z;
c[i][n+j]=1;
}
source=2*n+1;
dest=source+1;
for(i=1;i<=n;i++){
c[source][i]=1;
c[n+i][dest]=1;
}
for(i=1;i<=n;i++){
for(j=0;j<n;j++){
a[i][j]=n+j+1;
a[n+i][j]=j+1;
}
a[i][n]=source;
a[source][i-1]=i;
a[n+i][n]=dest;
a[dest][i-1]=n+i;
g[i]=n+1;
g[n+i]=n+1;
}
g[dest]=n;
g[source]=n;
}
int bellmanford(){
int i,j,k;
for(i=1;i<=dest;i++){
dist[i]=inf;
from[i]=-1;
u[i]=0;
}
dist[source]=0;
l=1;
q[l]=source;
u[source]=1;
for(i=1;i<=l;i++){
k=q[i];
for(j=0;j<g[k];j++){
if(c[k][a[k][j]]>f[k][a[k][j]]&&dist[k]+cost[k][a[k][j]]<dist[a[k][j]]){
dist[a[k][j]]=dist[k]+cost[k][a[k][j]];
from[a[k][j]]=k;
if(!u[a[k][j]]){
q[++l]=a[k][j];
u[a[k][j]]=1;
}
}
}
u[k]=0;
}
if(dist[dest]!=inf){
int vmin=inf;
drum=1;
for(i=dest;i!=source;i=from[i])vmin=min(vmin,c[from[i]][i]-f[from[i]][i]);
for(i=dest;i!=source;i=from[i]){
f[from[i]][i]=+vmin;
f[i][from[i]]=-vmin;
}
return vmin*dist[dest];
}
return 0;
}
long flux(){
long rez=0;
drum=1;
while(drum){
drum=0;
rez+=bellmanford();
}
return rez;
}
int main(){
citire();
fprintf(out,"%ld",flux());
// printf("(%d)",n);
fclose(in);
fclose(out);
return 0;
}