Pagini recente » Cod sursa (job #1772285) | Cod sursa (job #2153151) | Cod sursa (job #1344162) | Cod sursa (job #2010391) | Cod sursa (job #87629)
Cod sursa(job #87629)
#include <stdio.h>
#include <fstream>
using namespace std;
#define in "cast.in"
#define out "cast.out"
#define dim 13
int N, T, Tmin=-1;
int B[dim][1<<12-1], L[dim], C[dim];
bool Sel[dim];
int A[dim][dim];
int Maxim(int,int);
int Ok(int,int);
void Solve();
int main()
{
freopen(in,"r",stdin);
freopen(out,"w",stdout);
scanf("%d", &T);
for ( int k = 1; k <= T; k++ )
{
scanf("%d", &N);
for ( int i = 1; i <= N; i++ )
for ( int j = 1; j <= N; j++ )
scanf("%d", &A[i][j]);
Solve();
}
}
int Maxim(int a, int b)
{
if ( a > b ) return a;
return b;
}
int Minim(int a, int b)
{
if ( a < b ) return a;
return b;
}
int Ok(int k1, int k2)
{
for ( int i = 1; i <= N; i++ )
if ( (k2>>(i-1))&1 )
if ( !((k1>>(i-1))&1) ) return 0;
return 1;
}
void Solve()
{
int S = 1<<N;
S -= 1;
for ( int i = 1; i <= N; i++ )
for ( int j = 1; j <= S; j++ )
B[i][j] = 1000000;
for ( int i = 1; i <= N; i++ )
B[i][ 1<<(i-1) ] = 0;
for ( int k1 = 1; k1 <= S; k1++ )
{
for ( int i = 1; i <= N; i++ )
{
if ( (k1>>(i-1))&1 == 0 ) continue;
for ( int k2 = 1; k2 < k1; k2++ )
{
if ( !Ok(k1,k2) ) continue;
for ( int j = 1; j <= N; j++ )
{
if ( (k2>>(j-1))&1 == 0 || i == j ) continue;
B[i][k1] = Minim( B[i][k1], A[i][j] + Maxim(B[i][k1-k2],B[j][k2]) );
}
}
}
}
/* int size=0;
for ( int k1 = 1; k1 <= S; k1++ )
{
for ( int i = 1; i <= N; i++ )
{
if ( (k1>>(i-1))&1 == 0 ) continue;
size = 0;
for ( int j = 1; j <= N; j++ )
if ( i != j && (k1>>(j-1))&1 ) size++, L[size] = j;
for ( int k2 = 1; k2 <= 1<<size - 1; k2++ ) // sunt 2^size-1 posibilitati de a lua mult k1.
{
int t = 1, Q = 0;
for ( ; t <= size && 1<<(t-1) <= k2; t++ )
{
if ( (k2>>(t-1))&1 == 1 ) Q += 1<<(L[t]-1);
}
for ( int k = 1; k <= size; k++ )
{
int j = L[k];
B[i][k1] = Minim( B[i][k1], A[i][j] + Maxim(B[i][k1-Q],B[j][Q]) );
}
}
}
}
for ( int i = 1; i <= N; i++, printf("\n") )
for ( int j = 1; j <= (1 << N) - 1; j++ )
printf("%d ", B[i][j]);*/
printf("%d\n", B[1][S]);
}