Pagini recente » Cod sursa (job #2737651) | Clasament faherhe | Cod sursa (job #1953308) | Cod sursa (job #1827795) | Cod sursa (job #604272)
Cod sursa(job #604272)
#include<stdio.h>
#include<vector>
#include<queue>
#include<algorithm>
#define INF 0x3f3f3f3f
#define maxN 205
#define S 202
#define D 203
#define dif 100
using namespace std;
FILE*f=fopen("cc.in","r");
FILE*g=fopen("cc.out","w");
int n,i,j,c,C[maxN],minim,CostCuplaj; bool inQ[maxN];
int nod,nodvcn,T[maxN];
short int Cp[maxN][maxN],F[maxN][maxN];
vector< pair<short int,short int> >G[maxN];
queue<short int>Q; int qsize;
inline void citire () {
fscanf(f,"%d",&n);
for ( i = 1 ; i <= n ; ++i ){
for ( j = 1 ; j <= n ; ++j ){
fscanf(f,"%d",&c);
G[i].push_back( make_pair(j+dif,c) );
G[j+dif].push_back( make_pair(i,-c) );
Cp[i][j+dif] = 1;
}
}
}
inline void newedges () {
for ( i = 1 ; i <= n ; ++i ){
G[S].push_back( make_pair(i,0) );
Cp[S][i] = 1;
}
for ( i = 1 ; i <= n ; ++i ){
G[i+dif].push_back( make_pair(D,0) );
Cp[i+dif][D] = 1;
}
}
inline void init () {
memset(C,INF,sizeof(C));
memset(inQ,0,sizeof(inQ));
Q.push(S); inQ[S] = 1; qsize = 1; C[S] = 0; minim = INF;
}
inline bool bellmanford () {
init(); vector< pair<short int,short int> >::iterator itt;
while ( qsize ){
nod = Q.front(); Q.pop(); --qsize; inQ[nod] = 0;
for ( itt = G[nod].begin() ; itt != G[nod].end() ; ++itt ){
nodvcn = itt->first; c = itt->second;
if ( Cp[nod][nodvcn] > F[nod][nodvcn] && C[nodvcn] > C[nod] + c ){
C[nodvcn] = C[nod] + c; T[nodvcn] = nod;
if ( !inQ[nodvcn] ){
inQ[nodvcn] = 1;
Q.push(nodvcn); ++qsize;
}
}
}
}
if ( C[D] != INF ){
for ( nod = D; T[nod] ; nod = T[nod] ){
minim = Cp[T[nod]][nod] - F[T[nod]][nod] < minim ? Cp[T[nod]][nod] - F[T[nod]][nod] : minim;
}
for ( nod = D; T[nod] ; nod = T[nod] ){
F[T[nod]][nod] += minim;
F[nod][T[nod]] -= minim;
}
}
return (C[D] != INF);
}
inline void cmcm () {
while ( bellmanford() ){
CostCuplaj += minim * C[D];
}
fprintf(g,"%d\n",CostCuplaj);
}
int main () {
citire();
newedges();
cmcm();
fclose(f);
fclose(g);
return 0;
}