Pagini recente » Diferente pentru implica-te/arhiva-educationala intre reviziile 223 si 202 | Cod sursa (job #3290444) | Cod sursa (job #3246069) | Cod sursa (job #3283391) | Cod sursa (job #3193150)
#include <fstream>
#include <cstring>
#include <queue>
using namespace std;
#define INF 1e9
ifstream f("cc.in");
ofstream g("cc.out");
int i, n, j, nod, destinatie, flux, predecesor[101], dist[101], G[101][101], cost[101][101];
bool viz[101];
queue<int> q;
bool bellmanFord()
{
int x;
memset(viz, 0, sizeof(viz));
memset(dist, INF, sizeof(dist));
dist[nod] = 0;
viz[nod] = 1;
q.push(nod);
while (!q.empty())
{
x = q.front();
q.pop();
viz[x] = 0;
for (i = 1; i <= destinatie; i++)
if (G[x][i] && dist[i] > dist[x] + cost[x][i])
{
dist[i] = dist[x] + cost[x][i];
predecesor[i] = x;
if (!viz[i])
{
viz[i] = 1;
q.push(i);
}
}
}
return dist[destinatie] != INF;
}
int main()
{
f >> n;
nod = 0;
destinatie = 2 * n + 1;
for (i = 1; i <= n; i++)
{
G[nod][i] = 1;
G[i][nod] = 0;
G[n + i][destinatie] = 1;
G[destinatie][n + i] = 0;
}
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
{
f >> cost[i][n + j];
cost[n + j][i] = -cost[i][n + j];
G[i][n + j] = 1;
G[n + j][i] = 0;
}
flux = 0;
while (bellmanFord())
{
for (i = destinatie; i != nod; i = predecesor[i])
G[predecesor[i]][i]--, G[i][predecesor[i]]++;
flux += dist[destinatie];
}
g << flux << '\n';
return 0;
}