Pagini recente » Diferente pentru problema/cclj intre reviziile 37 si 38 | Cod sursa (job #15139) | Atasamentele paginii bruh | Cod sursa (job #1620493) | Cod sursa (job #2488257)
#include <fstream>
#include <vector>
#include <deque>
#include <bitset>
#define DIM 210
#define inf 2000000000
using namespace std;
ifstream fin("cc.in");
ofstream fout("cc.out");
int n,i,j,sol,x,nod,vecin,fluxmin,dist[DIM],cap[DIM][DIM],flux[DIM][DIM],t[DIM],cost[DIM][DIM];
vector<int> L[DIM];
deque<int> q;
bitset<DIM> f;
int bf() {
int gasit=0;
f.reset();
for (i=1;i<=2*n+1;i++)
dist[i]=inf;
f[0]=1, dist[0]=0;
q.push_back(0);
while (!q.empty()) {
nod=q.front();
q.pop_front();
f[nod]=0;
for (i=0;i<L[nod].size();i++) {
vecin=L[nod][i];
if (dist[vecin]>dist[nod]+cost[nod][vecin]&&cap[nod][vecin]-flux[nod][vecin]>0) {
dist[vecin]=dist[nod]+cost[nod][vecin];
t[vecin]=nod;
if (f[vecin]==0) {
f[vecin]=1;
q.push_back(vecin);
if (vecin==2*n+1)
gasit=1;
}
}
}
}
return gasit;
}
int main() {
fin>>n;
for (i=1;i<=n;i++) {
for (j=1;j<=n;j++) {
fin>>x;
L[i].push_back(n+j);
L[n+j].push_back(i);
cap[i][n+j]=1;
cost[i][n+j]=x;
cost[n+j][i]=-x;
}
L[0].push_back(i);
L[i].push_back(0);
cap[0][i]=1;
L[n+i].push_back(2*n+1);
L[2*n+1].push_back(n+i);
cap[n+i][2*n+1]=1;
}
while (bf()) {
nod=2*n+1;
fluxmin=inf;
while (nod!=0) {
fluxmin=min(fluxmin,cap[t[nod]][nod]-flux[t[nod]][nod]);
nod=t[nod];
}
nod=2*n+1;
while (nod!=0) {
flux[t[nod]][nod]+=fluxmin;
flux[nod][t[nod]]-=fluxmin;
sol+=fluxmin*cost[t[nod]][nod];
nod=t[nod];
}
}
fout<<sol;
return 0;
}