Pagini recente » Cod sursa (job #64654) | Cod sursa (job #423607) | Cod sursa (job #1167399) | Cod sursa (job #524225) | Cod sursa (job #349609)
Cod sursa(job #349609)
#include<iostream>
#include<string>
using namespace std;
#define nm 14
#define nconf 4100
#define inf 2000000000
int timp[nm][nm],tmin[nm][nconf];
int t,n;
inline void reinit()
{
int i,j;
for(i=1;i<=n;i++)
for(j=0;j<(1<<n);j++)
tmin[i][j]=-1;
for(i=1;i<=n;i++)
tmin[i][(1<<(i-1))]=0;
}
void memo(int nod,int config)
{
int alpha[nm],dim=0,i,j,k;
if(tmin[nod][config]>=0) return ;
//bag intr-un sir bitii de 1
for(i=0;i<n;i++)
if(((1<<i)&config) && (i+1!=nod))
{
//este bit de 1 folositor
alpha[++dim]=i+1;
}
//imi creez noile configuratii
int best=inf;
for(i=1;i<=dim;i++)
{
int nnod=alpha[i];
for(j=0;j<(1<<dim);j++)
{
int nconfig=0,lconfig=0;
for(k=0;k<dim;k++)
if(((1<<k)&j) || (k+1==i))
nconfig+=(1<<(alpha[k+1]-1));
for(k=0;k<n;k++)
if(((1<<k)&config)&&!((1<<k)&nconfig))
lconfig+=(1<<k);
memo(nnod,nconfig);
memo(nod,lconfig);
best=min(best,max(tmin[nod][lconfig],tmin[nnod][nconfig])+timp[nod][nnod]);
}
}
tmin[nod][config]=best;
}
int main()
{
int i,j;
freopen("cast.in","r",stdin);
freopen("cast.out","w",stdout);
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&timp[i][j]);
reinit();
memo(1,(1<<n)-1);
printf("%d\n",tmin[1][((1<<n)-1)]);
}
return 0;
}