Pagini recente » Cod sursa (job #3218303) | Cod sursa (job #1956718) | Cod sursa (job #1492878) | Cod sursa (job #2198691) | Cod sursa (job #2604909)
#include <fstream>
#include <iostream>
#include <queue>
#include <vector>
#include <climits>
#define DIM 300
using namespace std;
ifstream fin("cc.in");
ofstream fout("cc.out");
int i,j,n,x,sol,ok,D[DIM],f[DIM],flux[DIM][DIM],c[DIM][DIM],z[DIM][DIM],dst,T[DIM];
vector<int> L[DIM];
queue<int> q;
int ford(){
for(i=0;i<=2*n+1;i++){
f[i]=0;
D[i]=INT_MAX;
}
f[0]=1;
D[0]=ok=0;
q.push(0);
while(!q.empty()){
int nod=q.front();
q.pop();
f[nod]=0;
for(int i=0;i<L[nod].size();i++){
int vec=L[nod][i];
if(D[vec]>D[nod]+z[nod][vec]&&c[nod][vec]>flux[nod][vec]){
D[vec]=D[nod]+z[nod][vec];
if(f[vec]==0){
f[vec]=1;
q.push(vec);
if(vec==dst)
ok=1;
}
T[vec]=nod;
}
}
}
return ok;
}
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);
c[i][n+j]=1;
z[i][n+j]=x;
z[n+j][i]=-x;
}
dst=2*n+1;
for(i=1;i<=n;i++){
L[0].push_back(i);
c[0][i]=1;
L[i].push_back(0);
L[dst].push_back(n+i);
L[n+i].push_back(dst);
c[n+i][dst]=1;
}
while(ford()){
int nod=dst;
while(nod!=0){
flux[T[nod]][nod]++;
flux[nod][T[nod]]--;
nod=T[nod];
}
sol+=D[dst];
}
fout<<sol;
return 0;
}