Pagini recente » Istoria paginii runda/preojigim/clasament | Cod sursa (job #2106987) | Istoria paginii runda/prega_oji2015_vi_3/clasament | Autentificare | Cod sursa (job #164927)
Cod sursa(job #164927)
# 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[maxV][max];
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[1<<i][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[mask][i] = minim(d[mask][i] , c[i][p[j]] + maxim( d[mask2][i] , d[mask1][p[j]] ));
}
}
}
}
return d[(1<<n)-1][0];
}
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;
}