Pagini recente » Cod sursa (job #2050742) | Cod sursa (job #1082605) | Cod sursa (job #2820222) | Cod sursa (job #3257454) | Cod sursa (job #303734)
Cod sursa(job #303734)
#include <stdio.h>
#include <vector>
#include <bitset>
#include <queue>
using namespace std;
#define oo 2000000000
#define N 205
vector <short int>a[N];
short int cost[N][N],n,cap[N][N],source,dest,path[N],t[N];
int d[N],flux,costflux,minim;
FILE *in=fopen("cc.in","r"),*out=fopen("cc.out","w");
void citire(){
short int i,j,c;
fscanf(in,"%hd",&n);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){
fscanf(in,"%hd",&c);
cost[i][n+j]=c;
cost[n+j][i]=-c;
cap[i][n+j]=1;
}
source=2*n+1;
dest=source+1;
for(i=1;i<=n;i++){
cap[source][i]=1;
cap[n+i][dest]=1;
for(j=1;j<=n;j++){
a[i].push_back(n+j);
a[n+j].push_back(i);
}
a[source].push_back(i);
a[i].push_back(source);
a[dest].push_back(n+i);
a[n+i].push_back(dest);
}
}
void bellman(){
bitset<N>v;queue<int>q;short int nod,fiu;
int i,x;
while(!q.empty())q.pop();
q.push(source);
for(i=1;i<=dest;i++){d[i]=oo;t[i]=0;v[i]=0;}
d[source]=0;
v[source]=1;
while(!q.empty()){
nod=q.front();
q.pop();
v[nod]=0;
x=a[nod].size();
for(i=0;i<x;i++){
fiu=a[nod][i];
if(cap[nod][fiu]){
if(d[fiu]>d[nod]+cost[nod][fiu]){
d[fiu]=d[nod]+cost[nod][fiu];
t[fiu]=nod;
if(!v[fiu]){
q.push(fiu);
v[fiu]=1;
}
}
}
}
}
}
void calculare_flux(){
int m,aux,i;
do{
bellman();
if(d[dest]==oo) {
// for(i=1;i<=dest;i++)printf(" (%d) ",d[i]);
// printf("GURUR");
break;}
minim=oo;
for(aux=dest,m=0;aux;path[++m]=aux,aux=t[aux]);
for(i=1;i<m;i++)
if(minim>cap[path[i+1]][path[i]])minim=cap[path[i+1]][path[i]];
for(i=1;i<m;i++){
cap[path[i+1]][path[i]]-=minim;
cap[path[i]][path[i+1]]+=minim;
}
flux=minim;
costflux+=minim*d[dest];
//printf("(%d)",flux);
}
while(1);
}
/*
void afisare(){
int i,j,x;
for(i=1;i<=dest;i++){
fprintf(out,"\n");
x=a[i].size();
for(j=0;j<x;j++){
fprintf(out,"%hd ",a[i][j]);
}
}
}
*/
int main(){
citire();
calculare_flux();
fprintf(out,"%d",costflux);
// afisare();
fclose(out);
fclose(in);
return 0;
}