Cod sursa(job #1012246)

Utilizator caliuxSegarceanu Calin caliux Data 18 octombrie 2013 16:07:25
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <stdio.h>
using namespace std;

const int NMAX = 20;
const int NMAXPOW2 = 1 << NMAX;

int N, M;
int muchie[NMAX][NMAX];
int Ciclu[NMAX][NMAXPOW2];

int ciclu(int nodAnterior, int exista){
    int SOL = 0x3fffffff;
    if(Ciclu[nodAnterior][exista] == 0){
        if(exista == ((1 << N) - 1)){
            if(muchie[nodAnterior][0] != 0){
                return muchie[nodAnterior][0];
            }
            return 0x3fffffff;
        }else{
            int i;
            SOL = 0x3fffffff;
            int solPotentiala = 0;
            for(i = 0; i < N; i++){
                if((exista & (1 << i)) == 0){
                    if(muchie[nodAnterior][i] != 0){
                        solPotentiala = muchie[nodAnterior][i] + ciclu(i, exista ^ (1 << i));
                        if(SOL > solPotentiala){
                            SOL = solPotentiala;
                        }
                    }
                }
            }
        }
        Ciclu[nodAnterior][exista] = SOL;
    }
    return Ciclu[nodAnterior][exista];
}

int main(){
    freopen("hamilton.in", "r", stdin);
    freopen("hamilton.out", "w", stdout);
    int x, y, c;
    int i, j;
    scanf("%d%d", &N, &M);
    for(i = 1; i <= M; i++){
        scanf("%d %d %d", &x, &y, &c);
        muchie[x][y] = c;
    }
    int SOL;
    SOL = ciclu(0, 1 << 0);
    if(SOL == 0x3fffffff) {
        printf("Nu exista solutie");
    }else{
        printf("%d", SOL);
    }
}