Cod sursa(job #87638)

Utilizator cos_minBondane Cosmin cos_min Data 27 septembrie 2007 22:44:00
Problema Cast Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <cstdio>
#include <cstring>

using namespace std;

#define Nmax 13
#define min(a,b) ((a) < (b) ? (a) : (b))
#define max(a,b) ((a) > (b) ? (a) : (b))

int n, t;
int mat[Nmax][Nmax], sir[Nmax];
int d[Nmax][1 << Nmax];

void solve()
{
    int i, j, mask, mask1, mask2, mask3, ct, nod, lim;
    
    memset(d, 0x3f, sizeof(d));
    for (i = 1; i <= n; ++i)
    	d[i][0] = 0;
	for (mask = 1; mask < 1 << n; ++mask)
        for (nod = 1; nod <= n; ++nod)
            if ((mask >> (nod - 1)) & 1)
            {
            	if ((mask ^ (1 << (nod - 1))) == 0)
                {
                	d[nod][mask] = 0;
                    continue;
            	}
            	ct = 0;
                for (i = 0; i < n; ++i)
                	if (nod != i + 1 && ((mask >> i) & 1))
                        sir[++ct] = i + 1;
                for (mask1 = 1; mask1 < 1 << ct; ++mask1)
                {
                    mask2 = 0;
                    for (i = 1; i <= ct; ++i)
                    	if ((mask1 >> (i - 1)) & 1)
                        	mask2 += 1 << (sir[i] - 1);
                   	
                   //	printf("%d ", mask2);
                    mask3 = mask ^ mask2;
                    for (i = 1; i <= ct; ++i)
                        d[nod][mask] = min(d[nod][mask], mat[nod][sir[i]] + max(d[sir[i]][mask2], d[nod][mask3]));
                }
                //printf("%d %d -> %d\n", nod, mask, d[nod][mask]);
            }
 
 /*printf("\n");
    for ( int i = 1; i <= n; i++, printf("\n") )
        for ( int j = 1; j <= (1 << n) - 1; j++ )
            printf("%d ", d[i][j]);*/
            
    printf("%d\n", d[1][(1 << n) - 1]);
}

void citire()

{
	int i, j;
	scanf("%d\n", &t);
    while (t)
    {
        scanf("%d\n", &n);
        for (i = 1; i <= n; ++i)
        	for (j = 1; j <= n; ++j)
            	scanf("%d", &mat[i][j]);
        solve();
    	--t;
    }
}

int main()
{
	freopen("cast.in", "r", stdin);
    freopen("cast.out", "w", stdout);
    citire();
    return 0;
}