Pagini recente » Cod sursa (job #3184532) | Cod sursa (job #829978) | Cod sursa (job #1918603) | Istoria paginii runda/please_d0_not_enter | Cod sursa (job #2245574)
#include <cstdio>
#include <deque>
#include <vector>
#include <bitset>
#define DIMN 201
#define INF 2000000000
using namespace std;
int dist[DIMN],tt[DIMN],n,s,d;
bitset <DIMN> f;
vector <int> v[DIMN];
deque <int> dq;
int c[DIMN][DIMN],cst[DIMN][DIMN],fl[DIMN][DIMN];
int bellmanford (){
int i,nod,vecin;
for (i=0;i<=2*n+1;i++){
dist[i]=INF;
tt[i]=-1;
}
f.reset();
dq.push_back(s);
dist[s]=0;
f[s]=1;
while (dq.size()){
nod=dq.front();
// printf ("%d ",nod);
for (i=0;i<v[nod].size();i++){
vecin=v[nod][i];
if (c[nod][vecin]>fl[nod][vecin] && dist[nod]+cst[nod][vecin]<dist[vecin]){
dist[vecin]=dist[nod]+cst[nod][vecin];
tt[vecin]=nod;
if (!f[vecin]) {// nu e in deque
f[vecin]=1;
dq.push_back(vecin);
}
}
}
f[nod]=0;
dq.pop_front();
}
if (dist[d]==INF)
return 0; /// nu se mai poate pune flux
return 1;
}
int main()
{
FILE *fin=fopen ("cc.in","r");
FILE *fout=fopen ("cc.out","w");
int i,j,x,nod,vecin,sol,mini;
fscanf (fin,"%d",&n);
for (i=1;i<=n;i++){
for (j=n+1;j<=2*n;j++){
fscanf (fin,"%d",&x);
v[i].push_back(j);
v[j].push_back(i);
c[i][j]=1;
cst[i][j]=x;
cst[j][i]=-x;
}
}
for (i=1;i<=n;i++){
v[0].push_back(i);
v[i].push_back(0);
c[0][i]=1;
}
for (i=n+1;i<=2*n;i++){
v[2*n+1].push_back(i);
v[i].push_back(2*n+1);
c[i][2*n+1]=1;
}
s=0;
d=2*n+1;
sol=0;
while (bellmanford()){ /// cat timp mai introduc flux
vecin=d;
nod=tt[d];
mini=INF;
while (nod!=-1){
mini=min(mini,c[nod][vecin]-fl[nod][vecin]);
vecin=nod;
nod=tt[nod];
}
vecin=d;
nod=tt[d];
while (nod!=-1){
fl[nod][vecin]+=mini;
fl[vecin][nod]-=mini;
vecin=nod;
nod=tt[nod];
}
sol+= dist[d]*mini;
}
fprintf (fout,"%d",sol);
return 0;
}