Pagini recente » Cod sursa (job #1875422) | Cod sursa (job #1137504) | Cod sursa (job #782465) | Cod sursa (job #2446309) | Cod sursa (job #579642)
Cod sursa(job #579642)
#include <cstdio>
#include <vector>
#include <queue>
#include <bitset>
#define INF 0x3f3f3f3
#define MAXN 250
using namespace std;
bitset <MAXN> viz;
vector <int> G[MAXN];
int matFlux[MAXN][MAXN], matCost[MAXN][MAXN], D[MAXN], matCap[MAXN][MAXN];
int dad[MAXN], source, dest, N;
inline bool BF ()
{
queue <int> Q;
viz.reset ();
for (int i = 1; i <= dest; i++) {
D[i] = INF;
dad[i] = 0;
}
D[source] = 0;
Q.push (source);
int nod;
while (!Q.empty ()) {
nod = Q.front ();
Q.pop ();
viz[nod] = 0;
for (vector <int> :: iterator it = G[nod].begin (); it != G[nod].end (); it++)
if (D[*it] > D[nod] + matCost[nod][*it] && matCap[nod][*it] > matFlux[nod][*it]) {
D[*it] = D[nod] + matCost[nod][*it];
dad[*it] = nod;
if (viz[*it] == 0) {
viz[*it] = 1;
Q.push (*it);
}
}
}
return D[dest] != INF;
}
int main ()
{
freopen ("cc.in", "r", stdin);
freopen ("cc.out", "w", stdout);
int i, j;
scanf ("%d\n", &N);
source = 1;
dest = 2 * N + 2;
for (i = 2; i <= N + 1; i++) {
G[source].push_back (i);
G[i].push_back (source);
matCap[source][i] = 1;
for (j = N + 2; j <= 2 * N + 1; j++) {
scanf ("%d", &matCost[i][j]);
matCost[j][i] = - matCost[i][j];
G[i].push_back (j);
G[j].push_back (i);
matCap[i][j] = 1;
G[dest].push_back (j);
G[j].push_back (dest);
matCap[j][dest] = 1;
}
}
int flowcost = 0, fmin;
while (BF ()) {
fmin = INF;
for (i = dest; i != source; i = dad[i])
fmin = min (fmin, matCap[dad[i]][i] - matFlux[dad[i]][i]);
for (i = dest; i != source; i = dad[i]) {
matFlux[dad[i]][i] += fmin;
matFlux[i][dad[i]] -= fmin;
}
flowcost += fmin * D[dest];
}
printf ("%d\n", flowcost);
return 0;
}