Pagini recente » Cod sursa (job #1169710) | Cod sursa (job #1484605) | Cod sursa (job #77522) | Cod sursa (job #1345324) | Cod sursa (job #87761)
Cod sursa(job #87761)
#include <stdio.h>
#include <fstream>
#include <cstring>
using namespace std;
#define in "cast.in"
#define out "cast.out"
#define dim 13
int N, T, Tmin=-1;
int B[dim][8193], L[dim], sir[dim];
bool Sel[8193][dim];
int A[dim][dim];
int Maxim(int,int);
int Ok(int,int);
void Solve();
int main()
{
int i, k1, j;
freopen(in,"r",stdin);
freopen(out,"w",stdout);
memset(Sel,0,sizeof(Sel));
/* Precalculare */
for ( k1 = 1; k1 <= 8192; k1++ )
{
for ( i = 1; i < 13; i++ )
if ( (k1>>(i-1)) & 1 ) Sel[k1][i] = 1;
}
scanf("%d", &T);
for ( ; T > 0; --T )
{
scanf("%d", &N);
for ( i = 1; i <= N; i++ )
for ( j = 1; j <= N; j++ )
scanf("%d", &A[i][j]);
Solve();
}
}
inline int Minim(int a, int b)
{ return (a < b ? a : b); }
inline int Maxim(int a, int b)
{ return (a > b ? a : 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;
memset(B, 0x3f, sizeof(B) );
for ( int i = 1; i <= N; i++ )
{
B[i][ (1<<(i-1)) ] = 0;
}
/* 20 + TLE
for ( int k1 = 1; k1 <= S; ++k1 )
{
for ( int i = 1; i <= N && 1<<(i-1) <= k1; ++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 && 1<<(j-1) <= k2; ++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]) );
}
}
}
}*/
/* 100 */
int k1, i, j, k2, t, Q1;
int size=0, Q=0;
for ( k1 = 1; k1 <= S; ++k1 )
for ( i = 1; i <= N; ++i )
if ( Sel[k1][i] )
{
size = 0;
for ( j = 1; j <= N; ++j ) // elementele posibile pentru multimie S2
{
if ( i != j && Sel[k1][j] ) L[++size] = j;
}
for ( k2 = 1; k2 < (1<<size); ++k2 ) // 2^size - 1 posibilitati de a lua multimea S2
{
Q = 0;
for ( t = 1; t <= size; ++t )
{
if ( Sel[k2][t] ) Q += 1<<(L[t]-1);
}
Q1 = k1 - Q;
for ( t = 1; t <= size; ++t )
B[i][k1] = Minim( B[i][k1], A[i][L[t]] + Maxim(B[L[t]][Q],B[i][Q1]) );
}
}
printf("%d\n", B[1][S]);
}