Pagini recente » Cod sursa (job #2028599) | Cod sursa (job #2800208) | Cod sursa (job #2281487) | Cod sursa (job #155545) | Cod sursa (job #592488)
Cod sursa(job #592488)
#include <cstring>
#include <fstream>
#include <algorithm>
#include <queue>
using namespace std;
const int INF = 0x3f3f3f3f;
int N, Cost[205][205];
int F[205][205], C[205][205];
queue<int> Q;
int Dist[205], Tat[205];
bool inQ[205];
int minC;
bool BellmanFord();
int main()
{
ifstream fin("cc.in");
ofstream fout("cc.out");
fin >> N;
for (int i = 1; i <= N; ++i)
for (int j = 1, cost; j <= N; ++j)
{
fin >> cost;
Cost[i][N + j] = cost;
Cost[N + j][i] = -cost;
C[i][N + j] = 1;
}
for (int i = 1; i <= N; ++i)
{
C[0][i] = 1;
C[N + i][2 * N + 1] = 1;
}
while (BellmanFord());
fout << minC;
fin.close();
fout.close();
}
bool BellmanFord()
{
for (int i = 1; i <= 2 * N + 1; ++i)
Dist[i] = INF;
Dist[0] = 0;
Q.push(0);
while (!Q.empty())
{
int now = Q.front(); Q.pop();
inQ[now] = false;
for (int i = 1; i <= 2 * N + 1; ++i)
if (F[now][i] < C[now][i] && Dist[now] + Cost[now][i] < Dist[i])
{
Dist[i] = Dist[now] + Cost[now][i];
Tat[i] = now;
if (!inQ[i])
{
inQ[i] = true;
Q.push(i);
}
}
}
if (Dist[2 * N + 1] == INF) return false;
for (int i = 2 * N + 1; i != 0; i = Tat[i])
++F[Tat[i]][i], --F[i][Tat[i]];
minC += Dist[2 * N + 1];
return true;
}