Pagini recente » Cod sursa (job #1014876) | Cod sursa (job #2693198) | Cod sursa (job #1517274) | Monitorul de evaluare | Cod sursa (job #303774)
Cod sursa(job #303774)
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
#define MAX_N 205
#define INF 0x3f3f3f
#define foreach(V) for(typeof (V).begin() it = (V).begin(); it != (V).end(); ++it)
int N;
int C[MAX_N][MAX_N], F[MAX_N][MAX_N], Cost[MAX_N][MAX_N];
int Dist[MAX_N], T[MAX_N], viz[MAX_N];
int S, D;
vector <int> G[MAX_N];
void citire()
{
scanf("%d",&N);
D = 2*N + 1;
for(int i = 1; i <= N; ++i)
for(int j = N+1; j <= 2*N; ++j)
{
scanf("%d", Cost[i] + j);
Cost[j][i] = -Cost[i][j];
C[i][j] = 1;
G[i].push_back(j);
G[j].push_back(i);
}
for(int i = 1; i <= N; ++i)
{
C[0][i] = C[i+N][D] = 1;
G[S].push_back(i);
G[i].push_back(S);
G[D].push_back(i+N);
G[i+N].push_back(D);
}
}
int Bellman()
{
for(int i = S; i <= D; ++i)
Dist[i] = INF;
memset(viz, 0, sizeof viz);
queue <int> Q;
Dist[S] = 0;
viz[S] = 1;
Q.push(S);
while(!Q.empty())
{
int nod = Q.front();
viz[nod] = 0;
Q.pop();
foreach(G[nod])
{
int i = *it;
if((C[nod][i] - F[nod][i] > 0) && Dist[nod] + Cost[nod][i] < Dist[i])
{
Dist[i] = Dist[nod] + Cost[nod][i];
T[i] = nod;
if(!viz[i])
{
Q.push(i);
viz[i] = 1;
}
}
}
}
return (Dist[N] != INF);
}
void flux()
{
int flow = 0, fmin;
while(Bellman())
{
for(int i = D; i; i = T[i])
fmin = min(fmin, C[T[i]][i] - F[T[i]][i]);
for(int i = D; i; i = T[i])
F[T[i]][i] += fmin,
F[i][T[i]] -= fmin;
flow += fmin * Dist[D];
}
printf("%d\n",flow);
}
int main()
{
freopen("cc.in","rt",stdin);
freopen("cc.out","wt",stdout);
citire();
flux();
}