Pagini recente » Cod sursa (job #311738) | Cod sursa (job #266737) | Cod sursa (job #2748333) | Cod sursa (job #220658) | Cod sursa (job #3319813)
// Ilie "The-Winner" Dumitru
// Dumnezeu sa o ierte
#include<bits/stdc++.h>
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(), (x).end()
#define err(...) fprintf(stderr, __VA_ARGS__)
using ll=long long;
using dbl=long double;
constexpr int NMAX=12;
constexpr ll MOD=1'000'000'007;
int N;
int d[NMAX][NMAX];
int dp[1<<NMAX][NMAX];
int solve()
{
int mask, submask, i, j, maxMask=1<<N;
for(mask=0;mask<maxMask;++mask)
for(i=0;i<N;++i)
dp[mask][i]=MOD;
for(i=0;i<N;++i)
dp[1<<i][i]=0;
for(mask=3;mask<maxMask;++mask)
{
for(i=0;i<N;++i)
if(mask&(1<<i))
for(j=0;j<N;++j)
if(i!=j && (mask&(1<<j)))
{
for(submask=mask;submask;submask=mask&(submask-1))
{
if(submask&(1<<i))
submask^=1<<i;
if(!(submask&(1<<j)))
submask&=~((1<<j)-1);
if(submask==0)
break;
dp[mask][i]=std::min(dp[mask][i], d[i][j]+std::max(dp[submask][j], dp[mask^submask][i]));
}
}
// for(i=0;i<N;++i)
// err("%04b %d -> %d\n", mask, i, dp[mask][i]);
}
return dp[maxMask-1][0];
}
int main()
{
FILE* f=fopen("cast.in", "r"), *g=fopen("cast.out", "w");
int _, i, j;
fscanf(f, "%d", &_);
do
{
fscanf(f, "%d", &N);
for(i=0;i<N;++i)
for(j=0;j<N;++j)
fscanf(f, "%d", d[i]+j);
fprintf(g, "%d\n", solve());
}while(--_);
fclose(f);
fclose(g);
return 0;
}