Pagini recente » Cod sursa (job #127513) | Cod sursa (job #1477947) | Cod sursa (job #3237698) | Cod sursa (job #1736979) | Cod sursa (job #2485746)
#include <fstream>
#include <vector>
#include <bitset>
#include <deque>
#define inf 1000000000
using namespace std;
ifstream fin("cc.in");
ofstream fout("cc.out");
int n,m,i,j,c[210][210],flux[210][210],z[210][210],D[210],t[210],nod,vec,sol;
vector <int> l[210];
deque <int> q;
bitset <210> f;
bool ok;
bool bell(){
f.reset();
for(i=1;i<=n+n+1;i++)
D[i]=inf;
D[0]=0;
f[0]=1;
q.push_back(0);
ok=0;
while(!q.empty()){
nod=q.front();
f[nod]=0;
q.pop_front();
if(nod==n+n+1)
ok=1;
for(i=0;i<l[nod].size();i++){
vec=l[nod][i];
if(D[vec]>D[nod]+z[nod][vec] && c[nod][vec]-flux[nod][vec]>0){
D[vec]=D[nod]+z[nod][vec];
t[vec]=nod;
if(f[vec]==0){
f[vec]=1;
q.push_back(vec);
}
}
}
}
return ok;
}
int main(){
fin>>n;
for(i=1;i<=n;i++){
l[0].push_back(i);
l[i].push_back(0);
c[0][i]=1;
for(j=1;j<=n;j++){
l[i].push_back(j+n);
l[j+n].push_back(i);
c[i][j+n]=1;
fin>>z[i][j+n];
z[j+n][i]=-z[i][j+n];
}
l[i+n].push_back(n+n+1);
l[n+n+1].push_back(i+n);
c[i+n][n+n+1]=1;
}
while(bell()){
nod=n+n+1;
m=inf;
while(nod!=0){
m=min(m,c[t[nod]][nod]-flux[t[nod]][nod]);
nod=t[nod];
}
nod=n+n+1;
while(nod!=0){
flux[t[nod]][nod]+=m;
flux[nod][t[nod]]-=m;
nod=t[nod];
}
sol+=m*D[n+n+1];
}
fout<<sol;
return 0;
}