Pagini recente » Cod sursa (job #2978580) | Cod sursa (job #955308) | Cod sursa (job #1509306) | Cod sursa (job #3157270) | Cod sursa (job #639252)
Cod sursa(job #639252)
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
#define NM 205
#define PB push_back
#define inf 1000000000
int N, s, d, D[NM][NM], C[NM][NM], F[NM][NM], flow;
vector <int> G[NM];
int blf()
{
int inside[NM], dist[NM], fat[NM];
queue <int> Q;
memset (inside, 0, sizeof(inside));
for (int i = s; i <= d; ++i) dist[i] = inf;
Q.push(s);
inside[s] = 1;
dist[s] = 0;
fat[s] = -1;
while (!Q.empty())
{
int node = Q.front();
Q.pop();
inside[node] = 0;
for (vector<int>::iterator it = G[node].begin(); it != G[node].end(); ++it)
{
int nnode = *it;
if (C[node][nnode] == F[node][nnode]) continue;
if (dist[node] + D[node][nnode] < dist[nnode])
{
dist[nnode] = dist[node] + D[node][nnode];
fat[nnode] = node;
if (!inside[nnode])
{
Q.push(nnode);
inside[nnode] = 1;
}
}
}
}
/*
for (int i = 0; i <= d; ++i) printf ("%d ", dist[i]);
printf ("\n");
*/
if (dist[d] == inf) return 0;
int node = d, flowadd = inf;
while (fat[node] != -1)
{
int nnode = fat[node];
flowadd = min(flowadd, C[nnode][node] - F[nnode][node]);
node = nnode;
}
flow += dist[d]*flowadd;
node = d;
while (fat[node] != -1)
{
int nnode = fat[node];
F[nnode][node] += flowadd;
F[node][nnode] -= flowadd;
node = nnode;
}
return 1;
}
int main()
{
freopen ("cc.in", "r", stdin);
freopen ("cc.out", "w", stdout);
scanf ("%d", &N);
for (int i = 1; i <= N; ++i)
for (int j = 1; j <= N; ++j)
{
int dst;
scanf ("%d", &dst);
D[i][N+j] = dst;
D[N+j][i] = -dst;
G[i].PB(N+j);
G[N+j].PB(i);
C[i][N+j] = 1;
}
s = 0, d = 2*N + 1;
for (int i = 1; i <= N; ++i)
{
C[s][i] = 1;
G[s].PB(i);
G[i].PB(s);
}
for (int i = 1; i <= N; ++i)
{
C[N+i][d] = 1;
G[N+i].PB(d);
G[d].PB(N+i);
}
/*
for (int i = s; i <= d; ++i)
{
printf ("%d: -> ", i);
for (int j = 0; j < G[i].size(); ++j) printf ("%d ", G[i][j]);
printf ("\n");
}
*/
while (blf());
printf ("%d", flow);
return 0;
}