Pagini recente » Cod sursa (job #553082) | Cod sursa (job #88267)
Cod sursa(job #88267)
// O(3^N * N^2)
#include <stdio.h>
#define NMAX 13
#define INF 1000000000
int A[NMAX][NMAX];
int T[NMAX][1 << NMAX];
int state[NMAX], state2[NMAX];
int i, j, k, N, nones, ntwos, s, s2, t;
void generateStates2(int n)
{
if (n >= N)
{
if (ntwos == nones)
return;
s2 = 0;
for (i = 0; i < N; i++)
if (state2[i] == 1)
s2 |= (1 << i);
for (i = 0; i < N; i++)
if (state[i] == 1 && state2[i] == 0)
for (j = 0; j < N; j++)
if (state2[j] == 1)
{
/*
if (s == 1023 && s2 == 1020 && i == 0 && j == 5)
fprintf(stderr, "2\n");
if (s == 3 && s2 == 2 && i == 0 && j == 1)
fprintf(stderr, "1\n");
*/
if (T[j][s2] > T[i][s - s2])
t = T[j][s2];
else
t = T[i][s - s2];
if (t + A[i][j] < T[i][s])
T[i][s] = t + A[i][j];
}
}
else
{
if (state[n] == 0)
{
state2[n] = 0;
generateStates2(n + 1);
}
else
{
state2[n] = 0;
generateStates2(n + 1);
state2[n] = 1;
ntwos++;
generateStates2(n + 1);
ntwos--;
}
}
}
void generateStates(int n)
{
if (n >= N)
{
s = 0;
for (i = 0; i < N; i++)
if (state[i] == 1)
s |= (1 << i);
for (i = 0; i < N; i++)
T[i][s] = INF;
if (nones == 1)
{
for (i = 0; i < N; i++)
if (state[i] == 1)
T[i][s] = 0;
}
else
if (nones > 1)
{
ntwos = 0;
generateStates2(0);
}
}
else
{
state[n] = 0;
generateStates(n + 1);
state[n] = 1;
nones++;
generateStates(n + 1);
nones--;
}
}
int main()
{
int nt;
freopen("cast.in", "r", stdin);
freopen("cast.out", "w", stdout);
scanf("%d", &nt);
while (nt--)
{
scanf("%d", &N);
for (i = 0; i < N; i++)
for (j = 0; j < N; j++)
scanf("%d", &A[i][j]);
nones = 0;
generateStates(0);
printf("%d\n", T[0][(1 << N) - 1]);
fprintf(stderr, "%d\n", T[0][(1 << N) - 1]);
}
return 0;
}