Pagini recente » Cod sursa (job #1313755) | Cod sursa (job #3170458) | Cod sursa (job #1743404) | Cod sursa (job #1327404) | Cod sursa (job #1516593)
#include <fstream>
#include <bitset>
#include <vector>
#define INF 0x3f3f3f3f
#define DIM 205
#include <queue>
using namespace std;
ifstream fin("cc.in");
ofstream fout("cc.out");
int N, minim, flux, Cost;
vector <int> v[DIM];
bitset <DIM> U;
int T[DIM];
int D[DIM];
queue <int> Q;
int C[DIM][DIM],F[DIM][DIM],X[DIM][DIM];
int BF(){
U.reset();
for(int i=1;i<=2*N+1;i++)
D[i]=INF;
D[0]=0;
U[0]=1;
Q.push(0);
while(!Q.empty()){
int node = Q.front();
Q.pop();
U[node]=0;
for(vector <int>::iterator it=v[node].begin();it!=v[node].end();it++){
if(C[node][*it] > F[node][*it] && D[*it] > D[node] + X[node][*it]){
D[*it] = D[node] + X[node][*it];
T[*it] = node;
if(!U[*it]){
U[*it]=1;
Q.push(*it);
}
}
}
}
return D[2*N+1] != INF;
}
int main(){
fin >> N;
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++){
int x;
fin >> x;
v[i].push_back(j+N);
v[j+N].push_back(i);
C[i][j+N]=1;
X[i][j+N]=x;
X[j+N][i]=-x;
}
for(int i=1;i<=N;i++){
v[i].push_back(0);
v[0].push_back(i);
v[i+N].push_back(2*N+1);
v[2*N+1].push_back(i+N);
C[0][i] = 1;
C[N+i][2*N+1] = 1;
}
while(BF()){
minim = INF;
int u = 2*N+1;
while(u!=0){
if(minim > C[T[u]][u] - F[T[u]][u])
minim = C[T[u]][u] - F[T[u]][u];
u=T[u];
}
u= 2*N+1;
while(u!=0){
Cost += minim * X[T[u]][u];
F[T[u]][u] += minim;
F[u][T[u]] -= minim;
u=T[u];
}
}
fout << Cost << "\n";
}