Pagini recente » Cod sursa (job #2172508) | Cod sursa (job #2408991) | Cod sursa (job #2463141) | Cod sursa (job #2608571) | Cod sursa (job #150991)
Cod sursa(job #150991)
#include <stdio.h>
#include <string.h>
const int nm = 410;
const int inf = 1 << 30;
int cost[nm][nm], c[nm][nm], prev[nm], n, m, sol, used[nm], d[nm];
int s[201][201];
int flux();
bool bf(int);
int main()
{
freopen("paznici2.in", "r", stdin);
freopen("paznici2.out", "w", stdout);
int i, j;
scanf("%d", &n);
for(i = 1; i <= n; ++i)
{
c[0][i] = c[i + n][2 * n + 1] = 1;
for(j = 1; j <= n; ++j)
{
scanf("%d", &cost[i][n + j]);
c[i][n + j] = 1;
cost[n + j][i] = -cost[i][n + j];
}
}
sol = flux();
printf("%d\n", sol);
for(i = n + 1; i <= 2 * n; ++i) // obiectiv
{
(void)bf(i);
for(j = 1; j <= n; ++j) // paznic
{
if(cost[j][i] + d[j] == 0)
{
s[i - n][++s[i - n][0]] = j;
}
}
}
for(i = 1; i <= n; ++i)
{
printf("%d", s[i][0]);
for(j = 1; j <= s[i][0]; ++j)
{
printf(" %d", s[i][j]);
}
printf("\n");
}
return 0;
}
int flux()
{
int temp;
while(bf(0))
{
sol += d[2 * n + 1];
temp = 2 * n + 1;
while(prev[temp] != -1)
{
++c[temp][prev[temp]];
--c[prev[temp]][temp];
temp = prev[temp];
}
}
return sol;
}
bool bf(int nod)
{
int q[40010], st, dr, i, crt;
for(i = 1; i <= 2 * n + 1; ++i)
{
d[i] = inf;
prev[i] = -1;
}
prev[0] = -1;
memset(used, 0, sizeof(used));
d[nod] = 0;
st = dr = 1;
q[st] = nod;
while(st <= dr)
{
crt = q[st];
used[crt] = 0;
for(i = 1; i <= 2 * n + 1; ++i)
{
if(c[crt][i] && d[i] > d[crt] + cost[crt][i])
{
d[i] = d[crt] + cost[crt][i];
prev[i] = crt;
if(!used[i])
{
q[++dr] = i;
used[i] = 1;
}
}
}
++st;
}
return (d[2 * n + 1] != inf);
}