Pagini recente » Cod sursa (job #2162665) | Cod sursa (job #3189350) | Cod sursa (job #545174) | Cod sursa (job #676341) | Cod sursa (job #180311)
Cod sursa(job #180311)
#include <fstream>
#include <queue>
#include <vector>
#define INF 0x3f3f3f
#define MAX 420
using namespace std;
int cost[MAX][MAX], cmin[MAX], u[MAX];
bool F[MAX][MAX], s[MAX];
int n;
bool BellmanFord(int S, int D)
{
int i, j;
queue<int> q;
for (i = 0; i <= D; i++)
cmin[i] = INF, s[i] = 0, u[i] = -1;
q.push(S);
cmin[S] = 0;
s[S] = 1;
while (!q.empty())
{
i = q.front();
q.pop();
s[i] = 0;
for (j = 0; j <= D; j++)
if (F[i][j] && cmin[j] > cmin[i] + cost[i][j])
{
cmin[j] = cmin[i] + cost[i][j];
u[j] = i;
if (!s[j])
{
s[j] = 1;
q.push(j);
}
}
}
return (cmin[D] != INF);
}
int main()
{
int i, j, rez = 0, S = 0, D, p[MAX];
ifstream fin("paznici2.in");
fin >> n;
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
{
fin >> cost[i][n+j];
cost[n+j][i] -= cost[i][n+j];
F[i][n+j] = 1;
}
fin.close();
D = 2*n+1;
for (i = 1; i <= n; i++)
F[0][i] = 1;
for (i = n+1; i <= 2*n; i++)
F[i][D] = 1;
for (; BellmanFord(S, D); rez += cmin[D])
{
for (i = D; i; i = u[i])
F[u[i]][i] = 0, F[i][u[i]] = 1;
}
ofstream fout("paznici2.out");
fout << rez << "\n";
int x;
for (i = n+1; i < D; i++)
{
x = 0;
BellmanFord(i, D);
for (j = 1; j <= n; j++)
if (cost[i][j] == cmin[j]) p[++x] = j;
fout << x << " ";
for (j = 1; j <= x; j++)
fout << p[j] << " ";
fout << "\n";
}
fout.close();
return 0;
}