Pagini recente » Cod sursa (job #72464) | Cod sursa (job #1134665) | Cod sursa (job #1190445) | Cod sursa (job #1220547) | Cod sursa (job #164929)
Cod sursa(job #164929)
# include <cstdio>
//# include <cstring>
# include <vector>
using namespace std;
# define input "cast.in"
# define output "cast.out"
# define max 12
# define maxV 1<<max
int c[max][max];
long d[max][maxV];
int n,i,T,j,nr;
long mask,mask2,k,nrp,mask1;
int p[max];
int s[max];
int aux;
# define minim(a,b) (a<b?a:b)
# define maxim(a,b) (a>b?a:b)
long calcmin()
{
memset(d,1,sizeof(d));
for(i=0;i<n;i++)
d[i][1<<i] = 0;
for(mask = 1;mask < (1<<n);mask++)
{
for(i=0;i<n;i++)
{
if(mask&(1<<i))
{
nr = 0;
for(j=0;j<n;j++)
{
if(mask&(1<<j))
{
s[nr] = j;
nr++;
}
}
if(nr == 1)
continue;
for(k=1;k<(1<<nr);++k)
{
aux = k;
j=0;
mask1=0;
nrp=0;
while(aux)
{
if(aux&1)
{
mask1 += 1<<(s[j]);
p[nrp++] = s[j];
}
aux>>=1;
++j;
}
mask2 = mask-mask1;
for(j=0;j<nrp;++j)
d[i][mask] = minim(d[i][mask] , c[i][p[j]] + maxim( d[i][mask2] , d[p[j]][mask1] ));
}
}
}
}
return d[0][(1<<n)-1];
}
int main()
{
freopen(input,"r",stdin);
freopen(output,"w",stdout);
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&c[i][j]);
printf("%ld\n",calcmin());
}
return 0;
}