Cod sursa(job #2399300)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 7 aprilie 2019 12:25:45
Problema Cast Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <fstream>
#define DIM (1<<13)
#define DIMN 13
#define INF 2000000000
using namespace std;

ifstream fin ("cast.in");
ofstream fout ("cast.out");
int d[DIM][DIMN],a[DIMN][DIMN],p[DIM];
int t,n,i,j,nr1,nr2,total;
void back (int pas){
    if (pas == n)
        return;
    for (int i=0;i<=2;i++){
        if (i == 1)
            nr1 += (1<<pas);
        else {
            if (i == 2)
                nr2 += (1<<pas);
        }

        total = (nr1 | nr2);
        if (p[total])
            d[total][p[total]-1] = 0;
        else {
            for (int x=0;x<=pas;x++){
                if ( (nr1>>x)&1 )
                    for (int y=0;y<=pas;y++)
                        if ((nr2>>y)&1){
                            d[total][x] = min (d[total][x],max(d[nr1][x],d[nr2][y])+a[x][y]);
                            d[total][y] = min (d[total][y],max(d[nr1][x],d[nr2][y])+a[y][x]);
                        }
            }
        }
        back (pas+1);
        if (i == 1)
            nr1 -= (1<<pas);
        else
            if (i == 2)
                nr2 -= (1<<pas);
    }
}
int main (){

    fin>>t;
    for (;t--;){
        fin>>n;
        for (i=0;i<n;i++)
            for (j=0;j<n;j++)
                fin>>a[i][j];
        for (i=1;i<(1<<n);i++)
            for (j=0;j<n;j++)
                d[i][j] = INF;
        for (i=0;i<=n;i++)
            p[(1<<i)] = i+1;
        nr1 = nr2 = 0;
        back (0);
        fout<<d[(1<<n)-1][0]<<"\n";
    }



    return 0;
}