Pagini recente » Rating andreea gru (gru.andreea) | Rating Stanciu Carol (cqrol__) | Rating Andrei Dogarel (AndreiDogarel) | Rating Andreea Traistaru (andreea.traistaru00) | Cod sursa (job #782720)
Cod sursa(job #782720)
#include<fstream>
using namespace std;
typedef struct celula{
int nod;
celula *next;
}*lista;
lista graf[205],v;
bool viz[205],cap[205][205],ok;
int dist[205],tata[205],st[1000],cost[205][205],sol,n;
inline void update(){
int nod=2*n+1;
sol+=dist[nod];
while (tata[nod]!=nod){
cap[tata[nod]][nod]=0;
cap[nod][tata[nod]]=1;
nod=tata[nod];
}
}
inline void ford(){
int cp,coada;
cp=coada=1; st[cp]=0;
for (int i=0; i<=2*n+1; ++i){ viz[i]=0; dist[i]=1000000000;} viz[0]=1; dist[0]=0;
while (cp<=coada){
for (lista p=graf[st[cp]];p;p=p->next)
if (cap[st[cp]][p->nod]==1&&dist[st[cp]]+cost[st[cp]][p->nod]<dist[p->nod]){
dist[p->nod]=dist[st[cp]]+cost[st[cp]][p->nod];
tata[p->nod]=st[cp];
if (viz[p->nod]==0){++coada; st[coada]=p->nod; viz[p->nod]=1;}
}
viz[st[cp]]=0; ++cp;
}
if (dist[2*n+1]==1000000000) ok=false;
}
int main(void){
ifstream fin("cc.in");
ofstream fout("cc.out");
int i,j,x;
fin>>n;
for (i=1; i<=n; ++i){
cap[0][i]=true; v=new celula; v->nod=i; v->next=graf[0]; graf[0]=v;
v=new celula; v->nod=0; v->next=graf[i]; graf[i]=v;
cap[i+n][2*n+1]=true; v=new celula; v->nod=2*n+1; v->next=graf[i+n]; graf[i+n]=v;
v=new celula; v->nod=i+n; v->next=graf[2*n+1]; graf[2*n+1]=v;
for (j=1; j<=n; ++j){
fin>>x; cost[i][j+n]=x; cost[j+n][i]=-x; cap[i][j+n]=true;
v=new celula; v->nod=j+n; v->next=graf[i]; graf[i]=v;
v=new celula; v->nod=i; v->next=graf[j+n]; graf[j+n]=v;
}
}
ok=true;
while (ok){ ford(); if (ok) update(); }
fout<<sol;
return(0);
}