Pagini recente » Cod sursa (job #328124) | Cod sursa (job #645739) | Cod sursa (job #318622) | Cod sursa (job #2168355) | Cod sursa (job #566567)
Cod sursa(job #566567)
#include<cstdio>
#include<queue>
#define Nmax 256
#define inf 0x3f3f3f3f
using namespace std;
int N,fm[Nmax][Nmax],cost[Nmax][Nmax],t[Nmax],v[Nmax],vec[Nmax][Nmax],cp[Nmax][Nmax];
bool inQ[Nmax];
queue <int> c;
int bf(){
memset(inQ,0,sizeof(inQ));
memset(v,inf,sizeof(v));
v[0]=0;
c.push(0);
inQ[0]=1;
while(!c.empty()){
int nod=c.front();
c.pop();
inQ[nod]=0;
for(int dest=1; dest<=2*N+1; ++dest){
if(vec[nod][dest])
if(v[dest] > v[nod] + cost[nod][dest] && fm[nod][dest] < cp[nod][dest]){
v[dest]=v[nod]+cost[nod][dest];
t[dest]=nod;
if(!inQ[dest])
inQ[dest]=1,
c.push(dest);
}
}
}
if(v[2*N+1]!=inf)
return 1;
return 0;
}
int main(){
freopen("cc.in","r",stdin);
freopen("cc.out","w",stdout);
scanf("%d",&N);
for(int i=1;i<=N;++i)
for(int j=1;j<=N;++j){
int x;
scanf("%d",&x);
vec[i][N+j]=1;
vec[N+j][i]=1;
cp[i][N+j]=1;
cost[i][N+j]=x;
cost[N+j][i]=-x;
}
for(int i=1;i<=N;++i)
vec[0][i]=1,
vec[i][0]=1,
cp[0][i]=1,
cp[N+i][2*N+1]=1,
vec[N+i][2*N+1]=1,
vec[2*N+1][N+i]=1;
int sol=0;
while(bf()) {
int fmn=inf;
for(int nod=2*N+1;nod!=0;nod=t[nod])
fmn=min(fmn,1-fm[t[nod]][nod]);
for(int nod=2*N+1;nod!=0;nod=t[nod]){
fm[t[nod]][nod]+=fmn;
fm[nod][t[nod]]-=fmn;
}
sol+=v[2*N+1]*fmn;
}
printf("%d\n",sol);
return 0;
}