Cod sursa(job #1292577)

Utilizator atatomirTatomir Alex atatomir Data 14 decembrie 2014 15:06:10
Problema Ciclu hamiltonian de cost minim Scor 75
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>

using namespace std;

#define maxN 20
#define maxBit 18
#define d first
#define c second
#define INF 1000000000

long n,m,i,x,y,cost;
vector<pair<long,long> > list[maxN];
long dp[maxN][1<<maxBit];

long Calc(long nod,long conf){
    if(dp[nod][conf] == -1){
        dp[nod][conf] = INF;
        for(long i=0;i<list[nod].size();i++){
            long newNod = list[nod][i].d;
            if(((1<<newNod) & conf )||(conf ^ (1<<nod) == 0 && newNod == 0)){
                long newConf = conf ^ (1<<nod);
                dp[nod][conf] = min(dp[nod][conf],Calc(newNod,newConf) + list[nod][i].c);
            }
        }
    }
    return dp[nod][conf];
}

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

    scanf("%ld %ld",&n,&m);
    for(i=1;i<=m;i++){
        scanf("%ld %ld %ld",&x,&y,&cost);
        list[y].push_back(make_pair(x,cost));
    }

    memset(dp,-1,sizeof(dp));
    dp[0][0] = 0;

    Calc(0,(1<<n) - 1);
    if(dp[0][(1<<n) - 1] == INF)
        printf("Nu exista solutie");
    else
        printf("%ld",dp[0][(1<<n) - 1]);

    return 0;
}