Pagini recente » Cod sursa (job #1484683) | Cod sursa (job #678458) | Cod sursa (job #1305829) | Rating Razvan Baldovin (2amazing4me) | Cod sursa (job #1267720)
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define inf (1<<29)
using namespace std;
ifstream fin ("cc.in");
ofstream fout ("cc.out");
vector <int> l[210];
queue <int> q;
int fr,sc,n,x,S,D,i,j,minim,sol;
int d[210],c[210][210],f[210][210],t[210],cost[210][210];
bool viz[210];
bool bf () {
int nod;
memset (t,0,sizeof(t));
q.push(S);
for (int i=1;i<=D;i++)
d[i]=inf;
while (q.size()) {
nod=q.front();
q.pop();
viz[nod]=0;
for (int i=0;i<l[nod].size();i++) {
fr=l[nod][i]; sc=cost[nod][fr];
if (c[nod][fr]>f[nod][fr] && d[fr]>d[nod]+sc) {
d[fr]=d[nod]+sc;
if (!viz[fr]){
viz[fr]=1;
q.push(fr);
}
t[fr]=nod;
}
}
}
return (d[D]!=inf);
}
int main () {
fin>>n;
for (i=1;i<=n;i++)
for (j=1;j<=n;j++) {
fin>>x;
l[i].push_back(j+n);
l[j+n].push_back(i);
cost[i][j+n]=x;
cost[j+n][i]=-x;
c[i][j+n]=1;
}
for (i=1;i<=n;i++) {
l[0].push_back(i);
l[i].push_back(0);
c[0][i]=1;
l[i+n].push_back(2*n+1);
l[2*n+1].push_back(i+n);
c[i+n][2*n+1]=1;
}
D=2*n+1;
S=0;
while (bf()) {
minim=inf;
for (i=D;i!=S;i=t[i])
if (c[t[i]][i]-f[t[i]][i]<minim)
minim=c[t[i]][i]-f[t[i]][i];
sol+=minim*d[D];
for (i=D;i!=S;i=t[i]){
f[t[i]][i]+=minim;
f[i][t[i]]-=minim;
}
}
fout<<sol<<"\n";
return 0;
}