Pagini recente » Cod sursa (job #386154) | Cod sursa (job #2449258) | Cod sursa (job #2515841) | Cod sursa (job #1218118) | Cod sursa (job #1829054)
#include <cstdio>
#include <vector>
#include <cstring>
#define MAXN 202
#define MAXQ (1<<17)
#define INF 1000000000
std::vector <int> G[2*MAXN+2];
int cost[MAXN+1][MAXN+1];
int flux[MAXN+1][MAXN+1];
int from[MAXN+1];
int cap[MAXN+1][MAXN+1];
int dist[MAXN+1];
bool viz[MAXN+1];
int Q[MAXQ];
int C;
inline int BF(int S,int D,int n){
int b,e,x,nod,i;
memset(from,0,sizeof(from));
for(i=1;i<=n;i++)
dist[i]=INF;
dist[S]=0;
Q[0]=S;
viz[S]=1;
b=0;
e=1;
while(b<e){
nod=Q[b];
viz[nod]=0;
b++;
b&=(MAXQ-1);
for(auto x:G[nod])
if(cap[nod][x]>flux[nod][x]&&dist[x]>dist[nod]+cost[nod][x]){
dist[x]=dist[nod]+cost[nod][x];
from[x]=nod;
if(viz[x]==0){
viz[x]=1;
Q[e++]=x;
e&=(MAXQ-1);
}
}
}
C=dist[D];
if(C==INF)
C=0;
return C;
}
int main(){
FILE*fi,*fout;
int i,n,j,x,S,D,nod,min,ans;
fi=fopen("cc.in" ,"r");
fout=fopen("cc.out" ,"w");
fscanf(fi,"%d " ,&n);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){
fscanf(fi,"%d " ,&x);
G[i].push_back(j+n);
G[j+n].push_back(i);
cost[i][j+n]=x;
cost[j+n][i]=-x;
cap[i][j+n]=1;
}
S=2*n+1;
D=2*n+2;
for(i=1;i<=n;i++){
cap[S][i]=1;
G[S].push_back(i);
G[i].push_back(S);
}
for(i=1;i<=n;i++){
cap[i+n][D]=1;
G[i+n].push_back(D);
G[D].push_back(i+n);
}
ans=0;
while(BF(S,D,2*n+2)){
nod=D;
min=INF;
while(from[nod]){
if(min>cap[from[nod]][nod]-flux[from[nod]][nod])
min=cap[from[nod]][nod]-flux[from[nod]][nod];
nod=from[nod];
}
nod=D;
while(from[nod]){
flux[from[nod]][nod]+=min;
flux[nod][from[nod]]-=min;
nod=from[nod];
}
ans+=C;
}
fprintf(fout,"%d" ,ans);
fclose(fi);
fclose(fout);
return 0;
}