Cod sursa(job #918984)

Utilizator matei_cChristescu Matei matei_c Data 19 martie 2013 12:06:40
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std ;

#define maxn 20
#define maxd 262145
#define inf 10000000

int n, m ;
int N ;

int rez = inf ;

int cost[maxn][maxn] ;

int sol[maxd][maxn] ;

void citire()
{
    scanf("%d%d", &n, &m);

    N = ( 1 << n ) ;

    for(int i = 0; i < n; ++i )
        for(int j = 0; j < n; ++j )
            cost[i][j] = inf ;

    for(int i = 1; i <= m; ++i )
    {
        int x, y, c ;

        scanf("%d%d%d", &x, &y, &c);

        cost[x][y] = c ;
    }
}

void init()
{
    for(int i = 1; i < N; ++i )
        for(int j = 0; j < n; ++j )
            sol[i][j] = inf ;

    sol[1][0] = 0 ;
}

int calc(int sub, int nod)
{
    int x = inf ;

    for(int i = 0; i < n; ++i )
        if( sub & ( 1 << i ) > 0 && cost[i][nod] < inf )
            x = min( x, sol[sub][i] + cost[i][nod] ) ;

    return x ;
}

int main()
{
    freopen("hamilton.in", "r", stdin);
    freopen("hamilton.out", "w", stdout);

    citire() ;

    init() ;

    for(int i = 2; i < N; ++i )
        for(int j = 0; j < n; ++j )
            if( i & ( 1 << j ) > 0 )
                sol[i][j] = calc( i ^ ( 1 << j ), j ) ;

    for(int i = 0; i < n; ++i )
        if( cost[i][0] < inf )
            rez = min( rez, cost[i][0] + sol[N-1][i] ) ;\

    if( rez < inf )
        printf("%d\n", rez);
    else
        puts("Nu exista solutie");

    return 0 ;

}