Pagini recente » Cod sursa (job #2720648) | Cod sursa (job #2832451) | Cod sursa (job #40130) | Cod sursa (job #2720354) | Cod sursa (job #1327836)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("cc.in");
ofstream fout("cc.out");
#define MAX 203
#define INF (1<<30)
typedef vector<int> :: iterator iter;
vector<int> G[MAX];
queue <int> Q;
int C[MAX][MAX], Ca[MAX][MAX], F[MAX][MAX];
int dad[MAX], n, dist[MAX], maxflow;
bool bfs()
{
int i;
dad[0] = -1;
for(i = 1 ; i <= 2 * n + 1; i++)
{
dist[i] = INF;
dad[i] = -1;
}
Q.push(0);
while(Q.size())
{
int nod = Q.front();
Q.pop();
for(iter it = G[nod].begin() ; it != G[nod].end() ; it++)
{
if(F[nod][*it] < Ca[nod][*it] && dist[nod] + C[nod][*it] < dist[*it])
{
Q.push(*it);
dist[*it] = dist[nod] + C[nod][*it];
dad[*it] = nod;
}
}
}
if(dad[2 * n + 1] == -1)
return 0;
int s = 0;
int flow = INF;
for(i = 2 * n + 1 ; i ; i = dad[i])
{
flow = min(flow, Ca[dad[i]][i] - F[dad[i]][i]);
}
for(i = 2 * n + 1 ; i ; i = dad[i])
{
F[dad[i]][i] += flow;
F[i][dad[i]] -= flow;
s += flow * C[dad[i]][i];
}
maxflow += s;
return 1;
}
int main()
{
int i, j;
fin >> n;
for(i = 1 ; i <= n ; i++)
{
for(j = 1 ; j <= n ; j++)
{
G[i].push_back(j + n);
G[j + n].push_back(i);
fin >> C[i][j + n];
C[j + n][i] = -C[i][j + n];
Ca[i][j + n] = 1;
}
G[0].push_back(i);
G[i].push_back(0);
G[i + n].push_back(2 * n + 1);
G[2 * n + 1].push_back(i + n);
Ca[0][i] = 1;
Ca[i + n][2 * n + 1] = 1;
}
while(bfs());
fout << maxflow << "\n";
return 0;
}