Pagini recente » Cod sursa (job #499528) | Cod sursa (job #2649553) | Cod sursa (job #24383) | Cod sursa (job #7377) | Cod sursa (job #597689)
Cod sursa(job #597689)
#include<stdio.h>
#include<vector>
#include<utility>
#include<deque>
#include<stdlib.h>
#define NMAX 256
#define inf 0x3f3f3f3f
using namespace std;
int Cap[NMAX][NMAX],F[NMAX][NMAX];
int N;
vector< pair< int,int > > G[NMAX];
int D[NMAX],P[NMAX];
bool viz[NMAX];
int ans;
int BF(int source, int dest)
{
int i;
for( i=source; i<=dest; ++i )
D[i]=inf,viz[i]=0,P[i]=0;
deque < int > Deq;
Deq.push_back(source);
D[source]=0;viz[source]=1;
int nod;unsigned it;
int v,cost;
while( !Deq.empty() )
{
nod=Deq.front();
Deq.pop_front();
viz[nod]=0;
for( it=0; it<G[nod].size(); ++it )
{
v=G[nod][it].first;
cost=G[nod][it].second;
if( Cap[ nod ][ v ] == F[ nod ][ v ] )
continue;
if( D[nod]+cost<D[v] )
{
D[v]=D[nod]+cost;
P[v]=nod;
if( !viz[v] )
{
Deq.push_back( v );
viz[v]=1;
}
}
}
}
if( D[dest]==inf )
return 0;
/*
Compute flow
*/
int flow=inf;
nod=dest;
while( nod!=source )
{
flow=min( flow, Cap[ P[nod] ][ nod ]-F[ P[nod] ][ nod ] );
nod=P[nod];
}
nod=dest;
while( nod!=source )
{
F[ P[nod] ][nod]+=flow;
F[ nod ][P[nod]]-=flow;
nod=P[nod];
}
ans+=D[dest];
return flow;
}
int main()
{
freopen("cc.in","r",stdin);
freopen("cc.out","w",stdout);
int N;
scanf("%d",&N);
int i,j,cost;
for(i=1; i<=N; ++i)
for(j=1; j<=N; ++j)
{
scanf("%d",&cost);
Cap[i][N+j]=inf;
G[i].push_back( make_pair( N+j,cost ) );
G[N+j].push_back( make_pair( i,-cost ) );
}
int source=0;
int dest=(N<<1)+1;
for(i=1; i<=N; ++i)
{
Cap[source][i]=Cap[N+i][dest]=1;
G[source].push_back( make_pair(i,0) );
G[i].push_back( make_pair(source,0) );
G[dest].push_back( make_pair( N+i,0) );
G[N+i].push_back( make_pair( dest,0) );
}
ans=0;
while( BF(source,dest) );
printf("%d\n",ans);
return 0;
}